diff --git a/core/api-doc-config.generated.json b/core/api-doc-config.generated.json index 996ac06d..85adebb9 100644 --- a/core/api-doc-config.generated.json +++ b/core/api-doc-config.generated.json @@ -1,9 +1,9 @@ { - "_generated": "Auto-generated by extract-jsdoc.js on 2026-05-01T12:01:16.685Z. Do not edit manually.", + "_generated": "Auto-generated by extract-jsdoc.js on 2026-05-11T16:53:26.715Z. Do not edit manually.", "methods": { "has": { "summary": "HTTP verb for the endpoint (e.g. GET, POST). */", - "description": "method: string;\n /** URL path template, relative to the descriptor's baseUrl. */\n path: string;\n /** Whether this endpoint requires authenticated credentials. */\n isPrivate?: boolean;\n /** Identifier used to generate the implicit API method name. */\n operationId?: string;\n}\n\nexport interface ApiDescriptor {\n /** Base URL that all endpoint paths are resolved against. */\n baseUrl: string;\n /** Map of endpoint key to endpoint definition used by the implicit API machinery. */\n endpoints: Record;\n}\n\nexport interface ImplicitApiMethodInfo {\n /** Generated method name exposed on the exchange instance. */\n name: string;\n /** HTTP verb for the underlying endpoint. */\n method: string;\n /** URL path template for the underlying endpoint. */\n path: string;\n /** Whether the underlying endpoint requires authenticated credentials. */\n isPrivate: boolean;\n}\n\nexport interface MarketFilterParams {\n /** Maximum number of results to return */\n limit?: number;\n /** Pagination offset — number of results to skip */\n offset?: number;\n /** Sort order for results */\n sort?: 'volume' | 'liquidity' | 'newest';\n status?: 'active' | 'inactive' | 'closed' | 'all'; // Filter by market status (default: 'active', 'inactive' and 'closed' are interchangeable)\n searchIn?: 'title' | 'description' | 'both'; // Where to search (default: 'title')\n query?: string; // For keyword search\n slug?: string; // For slug/ticker lookup\n marketId?: string; // Direct lookup by market ID\n outcomeId?: string; // Reverse lookup -- find market containing this outcome\n eventId?: string; // Find markets belonging to an event\n page?: number; // For pagination (used by Limitless)\n similarityThreshold?: number; // For semantic search (used by Limitless)\n}\n\nexport interface MarketFetchParams extends MarketFilterParams {\n /** Optional client-side filter applied after fetching */\n filter?: MarketFilterCriteria;\n /** Filter by category. Each market belongs to a venue-assigned category such as \"Sports\", \"Politics\", \"Crypto\", \"Bitcoin\", \"Soccer\", \"Economic Policy\" (Polymarket) or \"Sports\", \"Mentions\" (Kalshi). */\n category?: string;\n /** Filter by tags. Returns markets matching ANY of the provided tags. Tags are more specific than categories -- for example a \"Sports\" market might carry tags [\"Sports\", \"FIFA World Cup\", \"2026 FIFA World Cup\"]. Common tags include \"Crypto\", \"Politics\", \"Elections\", \"Geopolitics\", \"Fed Rates\", \"Trump\". */\n tags?: string[];\n}\n\nexport interface EventFetchParams {\n query?: string; // For keyword search\n /** Maximum number of results to return */\n limit?: number;\n /** Pagination offset — number of results to skip */\n offset?: number;\n /** Sort order for results */\n sort?: 'volume' | 'liquidity' | 'newest';\n status?: 'active' | 'inactive' | 'closed' | 'all'; // Filter by event status (default: 'active', 'inactive' and 'closed' are interchangeable)\n /** Where to search (default: 'title') */\n searchIn?: 'title' | 'description' | 'both';\n eventId?: string; // Direct lookup by event ID\n slug?: string; // Lookup by event slug\n /** Optional client-side filter applied after fetching */\n filter?: EventFilterCriteria;\n /** Filter by category. Each event belongs to a venue-assigned category such as \"Sports\", \"Politics\", \"Crypto\", \"Bitcoin\", \"Soccer\", \"Economic Policy\" (Polymarket) or \"Sports\", \"Mentions\" (Kalshi). */\n category?: string;\n /** Filter by tags. Returns events matching ANY of the provided tags. Tags are more specific than categories -- for example a \"Politics\" event might carry tags [\"Politics\", \"Geopolitics\", \"Middle East\", \"Iran\"]. Common tags include \"Crypto\", \"Elections\", \"Fed Rates\", \"FIFA World Cup\", \"Trump\". */\n tags?: string[];\n}\n\n/**\nDeprecated - use OHLCVParams or TradesParams instead. Resolution is optional for backward compatibility.\n/\nexport interface HistoryFilterParams {\n resolution?: CandleInterval; // Optional for backward compatibility\n /** Start of the time range */\n start?: Date;\n /** End of the time range */\n end?: Date;\n /** Maximum number of results to return */\n limit?: number;\n}\n\nexport interface OHLCVParams {\n resolution: CandleInterval; // Required for candle aggregation\n /** Start of the time range */\n start?: Date;\n /** End of the time range */\n end?: Date;\n /** Maximum number of results to return */\n limit?: number;\n}\n\n/**\nParameters for fetching trade history. No resolution parameter - trades are discrete events.\n/\nexport interface TradesParams {\n // No resolution - trades are discrete events, not aggregated\n /** Start of the time range */\n start?: Date;\n /** End of the time range */\n end?: Date;\n /** Maximum number of results to return */\n limit?: number;\n}\n\nexport interface MyTradesParams {\n outcomeId?: string; // filter to specific outcome/ticker\n marketId?: string; // filter to specific market\n /** Only return records after this date */\n since?: Date;\n /** Only return records before this date */\n until?: Date;\n /** Maximum number of results to return */\n limit?: number;\n cursor?: string; // for Kalshi cursor pagination\n}\n\nexport interface OrderHistoryParams {\n marketId?: string; // required for Limitless (slug)\n /** Only return records after this date */\n since?: Date;\n /** Only return records before this date */\n until?: Date;\n /** Maximum number of results to return */\n limit?: number;\n /** Opaque pagination cursor from a previous response */\n cursor?: string;\n}\n\n// ----------------------------------------------------------------------------\n// Filtering Types\n// ----------------------------------------------------------------------------\n\nexport interface MarketFilterCriteria {\n // Text search\n text?: string;\n searchIn?: ('title' | 'description' | 'category' | 'tags' | 'outcomes')[]; // Default: ['title']\n\n // Numeric range filters\n volume24h?: { min?: number; max?: number };\n /** Filter by total (lifetime) volume range */\n volume?: { min?: number; max?: number };\n /** Filter by current liquidity range */\n liquidity?: { min?: number; max?: number };\n /** Filter by open interest range */\n openInterest?: { min?: number; max?: number };\n\n // Date filters\n resolutionDate?: {\n before?: Date;\n after?: Date;\n };\n\n // Category/tag filters\n /** Filter by category. Common values: \"Sports\", \"Politics\", \"Crypto\", \"Bitcoin\", \"Soccer\", \"Economic Policy\" (Polymarket) or \"Sports\", \"Mentions\" (Kalshi). */\n category?: string;\n /** Match markets that have ANY of these tags. Examples: [\"Crypto\", \"Crypto Prices\"], [\"Politics\", \"Elections\"], [\"Sports\", \"FIFA World Cup\"]. */\n tags?: string[];\n\n // Price filters (for binary markets)\n price?: {\n outcome: 'yes' | 'no' | 'up' | 'down';\n min?: number; // 0.0 to 1.0\n max?: number;\n };\n\n // Price change filters\n priceChange24h?: {\n outcome: 'yes' | 'no' | 'up' | 'down';\n min?: number; // e.g., -0.1 for 10% drop\n max?: number;\n };\n}\n\nexport type MarketFilterFunction = (market: UnifiedMarket) => boolean;\n\nexport interface EventFilterCriteria {\n // Text search\n text?: string;\n searchIn?: ('title' | 'description' | 'category' | 'tags')[]; // Default: ['title']\n\n // Category/tag filters\n /** Filter by category. Common values: \"Sports\", \"Politics\", \"Crypto\", \"Bitcoin\", \"Soccer\", \"Economic Policy\" (Polymarket) or \"Sports\", \"Mentions\" (Kalshi). */\n category?: string;\n /** Match events that have ANY of these tags. Examples: [\"Crypto\"], [\"Politics\", \"Geopolitics\", \"Middle East\"], [\"Sports\", \"FIFA World Cup\"]. */\n tags?: string[];\n\n // Filter by contained markets\n marketCount?: { min?: number; max?: number };\n totalVolume?: { min?: number; max?: number }; // Sum of market volumes\n}\n\nexport type EventFilterFunction = (event: UnifiedEvent) => boolean;\n\n// ----------------------------------------------------------------------------\n// Capability Map (ccxt-style exchange.has)\n// ----------------------------------------------------------------------------\n\nexport type ExchangeCapability = true | false | 'emulated';\n\nexport interface ExchangeHas {\n /** Whether this exchange supports fetching markets. */\n fetchMarkets: ExchangeCapability;\n /** Whether this exchange supports fetching events. */\n fetchEvents: ExchangeCapability;\n /** Whether this exchange supports fetching OHLCV candles. */\n fetchOHLCV: ExchangeCapability;\n /** Whether this exchange supports fetching the order book. */\n fetchOrderBook: ExchangeCapability;\n /** Whether this exchange supports fetching public trades. */\n fetchTrades: ExchangeCapability;\n /** Whether this exchange supports creating orders. */\n createOrder: ExchangeCapability;\n /** Whether this exchange supports cancelling orders. */\n cancelOrder: ExchangeCapability;\n /** Whether this exchange supports fetching a single order by id. */\n fetchOrder: ExchangeCapability;\n /** Whether this exchange supports fetching open orders. */\n fetchOpenOrders: ExchangeCapability;\n /** Whether this exchange supports fetching account positions. */\n fetchPositions: ExchangeCapability;\n /** Whether this exchange supports fetching account balances. */\n fetchBalance: ExchangeCapability;\n /** Whether this exchange supports subscribing to an on-chain address for updates. */\n watchAddress: ExchangeCapability;\n /** Whether this exchange supports unsubscribing from a watched address. */\n unwatchAddress: ExchangeCapability;\n /** Whether this exchange supports streaming order book updates. */\n watchOrderBook: ExchangeCapability;\n /** Whether this exchange supports batch-subscribing to multiple order book streams. */\n watchOrderBooks: ExchangeCapability;\n /** Whether this exchange supports unsubscribing from an order book stream. */\n unwatchOrderBook: ExchangeCapability;\n /** Whether this exchange supports streaming trade updates. */\n watchTrades: ExchangeCapability;\n /** Whether this exchange supports fetching the authenticated user's trade history. */\n fetchMyTrades: ExchangeCapability;\n /** Whether this exchange supports fetching closed orders. */\n fetchClosedOrders: ExchangeCapability;\n /** Whether this exchange supports fetching all orders (open and closed). */\n fetchAllOrders: ExchangeCapability;\n /** Whether this exchange supports building a signed order without submitting it. */\n buildOrder: ExchangeCapability;\n /** Whether this exchange supports submitting a pre-built order. */\n submitOrder: ExchangeCapability;\n /** Whether this exchange supports fetching cross-venue market matches. */\n fetchMarketMatches: ExchangeCapability;\n /** @deprecated Use {@link fetchMarketMatches} instead. */\n fetchMatches: ExchangeCapability;\n /** Whether this exchange supports fetching cross-venue event matches. */\n fetchEventMatches: ExchangeCapability;\n /** Whether this exchange supports comparing prices across venues. */\n compareMarketPrices: ExchangeCapability;\n /** Whether this exchange supports finding related markets across venues. */\n fetchRelatedMarkets: ExchangeCapability;\n /** Whether this exchange supports fetching matched markets across venues. */\n fetchMatchedMarkets: ExchangeCapability;\n /** @deprecated Use {@link fetchMatchedMarkets} instead. */\n fetchMatchedPrices: ExchangeCapability;\n /** @deprecated Use {@link fetchRelatedMarkets} instead. */\n fetchHedges: ExchangeCapability;\n /** @deprecated Use {@link fetchMatchedMarkets} instead. */\n fetchArbitrage: ExchangeCapability;\n}\n\n/**\nOptional authentication credentials for exchange operations.\n/\nexport interface ExchangeCredentials {\n // Standard API authentication (Kalshi, etc.)\n apiKey?: string;\n /** Standard API secret for HMAC-authenticated exchanges */\n apiSecret?: string;\n /** Standard API passphrase for HMAC-authenticated exchanges */\n passphrase?: string;\n /** Metaculus: `Authorization: Token ` for higher rate limits */\n apiToken?: string;\n\n // Blockchain-based authentication (Polymarket)\n privateKey?: string; // Required for Polymarket L1 auth\n\n // Polymarket-specific L2 fields\n signatureType?: number | string; // 0 = EOA, 1 = Poly Proxy, 2 = Gnosis Safe (Can also use 'eoa', 'polyproxy', 'gnosis_safe')\n funderAddress?: string; // The address funding the trades (defaults to signer address)\n}\n\nexport interface ExchangeOptions {\n /**\nHow long (ms) a market snapshot created by `fetchMarketsPaginated` remains valid\nbefore being discarded and re-fetched from the API on the next call.\nDefaults to 0 (no TTL — the snapshot is re-fetched on every initial call).\n/\n snapshotTTL?: number;\n}\n\n/** Shape returned by fetchMarketsPaginated */\nexport interface PaginatedMarketsResult {\n /** The page of unified markets */\n data: UnifiedMarket[];\n /** Total number of markets in the snapshot */\n total: number;\n /** Cursor to pass to the next call, or undefined if this is the last page */\n nextCursor?: string;\n}\n\n/** Shape returned by fetchEventsPaginated */\nexport interface PaginatedEventsResult {\n /** The page of unified events */\n data: UnifiedEvent[];\n /** Total number of events in the snapshot */\n total: number;\n /** Cursor to pass to the next call, or undefined if this is the last page */\n nextCursor?: string;\n}\n\n// ----------------------------------------------------------------------------\n// Base Exchange Class\n// ----------------------------------------------------------------------------\n\nexport abstract class PredictionMarketExchange {\n [key: string]: any; // Allow dynamic method assignment for implicit API\n\n public verbose: boolean = false;\n public http: AxiosInstance;\n public enableRateLimit: boolean = true;\n // Market Cache\n public markets: Record = {};\n public marketsBySlug: Record = {};\n public loadedMarkets: boolean = false;\n /**\nCapability map derived automatically from method overrides at runtime.\nExchanges do NOT need to declare this manually -- if a subclass overrides\na method (and the override does not throw \"not supported\"), it is `true`.\nTo mark a capability as `'emulated'`, add its key to `emulatedCapabilities`.", + "description": "method: string;\n /** URL path template, relative to the descriptor's baseUrl. */\n path: string;\n /** Whether this endpoint requires authenticated credentials. */\n isPrivate?: boolean;\n /** Identifier used to generate the implicit API method name. */\n operationId?: string;\n /**\nWhen set, requests use this base URL instead of the descriptor default\n(OpenAPI path- or operation-level `servers` override).\n/\n baseUrl?: string;\n}\n\nexport interface ApiDescriptor {\n /** Base URL that all endpoint paths are resolved against. */\n baseUrl: string;\n /** Map of endpoint key to endpoint definition used by the implicit API machinery. */\n endpoints: Record;\n}\n\nexport interface ImplicitApiMethodInfo {\n /** Generated method name exposed on the exchange instance. */\n name: string;\n /** HTTP verb for the underlying endpoint. */\n method: string;\n /** URL path template for the underlying endpoint. */\n path: string;\n /** Whether the underlying endpoint requires authenticated credentials. */\n isPrivate: boolean;\n}\n\nexport interface MarketFilterParams {\n /** Maximum number of results to return */\n limit?: number;\n /** Pagination offset — number of results to skip */\n offset?: number;\n /** Sort order for results */\n sort?: 'volume' | 'liquidity' | 'newest';\n status?: 'active' | 'inactive' | 'closed' | 'all'; // Filter by market status (default: 'active', 'inactive' and 'closed' are interchangeable)\n searchIn?: 'title' | 'description' | 'both'; // Where to search (default: 'title')\n query?: string; // For keyword search\n slug?: string; // For slug/ticker lookup\n marketId?: string; // Direct lookup by market ID\n outcomeId?: string; // Reverse lookup -- find market containing this outcome\n eventId?: string; // Find markets belonging to an event\n page?: number; // For pagination (used by Limitless)\n similarityThreshold?: number; // For semantic search (used by Limitless)\n}\n\nexport interface MarketFetchParams extends MarketFilterParams {\n /** Optional client-side filter applied after fetching */\n filter?: MarketFilterCriteria;\n /** Filter by category. Each market belongs to a venue-assigned category such as \"Sports\", \"Politics\", \"Crypto\", \"Bitcoin\", \"Soccer\", \"Economic Policy\" (Polymarket) or \"Sports\", \"Mentions\" (Kalshi). */\n category?: string;\n /** Filter by tags. Returns markets matching ANY of the provided tags. Tags are more specific than categories -- for example a \"Sports\" market might carry tags [\"Sports\", \"FIFA World Cup\", \"2026 FIFA World Cup\"]. Common tags include \"Crypto\", \"Politics\", \"Elections\", \"Geopolitics\", \"Fed Rates\", \"Trump\". */\n tags?: string[];\n}\n\nexport interface EventFetchParams {\n query?: string; // For keyword search\n /** Maximum number of results to return */\n limit?: number;\n /** Pagination offset — number of results to skip */\n offset?: number;\n /** Sort order for results */\n sort?: 'volume' | 'liquidity' | 'newest';\n status?: 'active' | 'inactive' | 'closed' | 'all'; // Filter by event status (default: 'active', 'inactive' and 'closed' are interchangeable)\n /** Where to search (default: 'title') */\n searchIn?: 'title' | 'description' | 'both';\n eventId?: string; // Direct lookup by event ID\n slug?: string; // Lookup by event slug\n /** Optional client-side filter applied after fetching */\n filter?: EventFilterCriteria;\n /** Filter by category. Each event belongs to a venue-assigned category such as \"Sports\", \"Politics\", \"Crypto\", \"Bitcoin\", \"Soccer\", \"Economic Policy\" (Polymarket) or \"Sports\", \"Mentions\" (Kalshi). */\n category?: string;\n /** Filter by tags. Returns events matching ANY of the provided tags. Tags are more specific than categories -- for example a \"Politics\" event might carry tags [\"Politics\", \"Geopolitics\", \"Middle East\", \"Iran\"]. Common tags include \"Crypto\", \"Elections\", \"Fed Rates\", \"FIFA World Cup\", \"Trump\". */\n tags?: string[];\n}\n\n/**\nDeprecated - use OHLCVParams or TradesParams instead. Resolution is optional for backward compatibility.\n/\nexport interface HistoryFilterParams {\n resolution?: CandleInterval; // Optional for backward compatibility\n /** Start of the time range */\n start?: Date;\n /** End of the time range */\n end?: Date;\n /** Maximum number of results to return */\n limit?: number;\n}\n\nexport interface OHLCVParams {\n resolution: CandleInterval; // Required for candle aggregation\n /** Start of the time range */\n start?: Date;\n /** End of the time range */\n end?: Date;\n /** Maximum number of results to return */\n limit?: number;\n}\n\n/**\nParameters for fetching trade history. No resolution parameter - trades are discrete events.\n/\nexport interface TradesParams {\n // No resolution - trades are discrete events, not aggregated\n /** Start of the time range */\n start?: Date;\n /** End of the time range */\n end?: Date;\n /** Maximum number of results to return */\n limit?: number;\n}\n\nexport interface MyTradesParams {\n outcomeId?: string; // filter to specific outcome/ticker\n marketId?: string; // filter to specific market\n /** Only return records after this date */\n since?: Date;\n /** Only return records before this date */\n until?: Date;\n /** Maximum number of results to return */\n limit?: number;\n cursor?: string; // for Kalshi cursor pagination\n}\n\nexport interface OrderHistoryParams {\n marketId?: string; // required for Limitless (slug)\n /** Only return records after this date */\n since?: Date;\n /** Only return records before this date */\n until?: Date;\n /** Maximum number of results to return */\n limit?: number;\n /** Opaque pagination cursor from a previous response */\n cursor?: string;\n}\n\n// ----------------------------------------------------------------------------\n// Filtering Types\n// ----------------------------------------------------------------------------\n\nexport interface MarketFilterCriteria {\n // Text search\n text?: string;\n searchIn?: ('title' | 'description' | 'category' | 'tags' | 'outcomes')[]; // Default: ['title']\n\n // Numeric range filters\n volume24h?: { min?: number; max?: number };\n /** Filter by total (lifetime) volume range */\n volume?: { min?: number; max?: number };\n /** Filter by current liquidity range */\n liquidity?: { min?: number; max?: number };\n /** Filter by open interest range */\n openInterest?: { min?: number; max?: number };\n\n // Date filters\n resolutionDate?: {\n before?: Date;\n after?: Date;\n };\n\n // Category/tag filters\n /** Filter by category. Common values: \"Sports\", \"Politics\", \"Crypto\", \"Bitcoin\", \"Soccer\", \"Economic Policy\" (Polymarket) or \"Sports\", \"Mentions\" (Kalshi). */\n category?: string;\n /** Match markets that have ANY of these tags. Examples: [\"Crypto\", \"Crypto Prices\"], [\"Politics\", \"Elections\"], [\"Sports\", \"FIFA World Cup\"]. */\n tags?: string[];\n\n // Price filters (for binary markets)\n price?: {\n outcome: 'yes' | 'no' | 'up' | 'down';\n min?: number; // 0.0 to 1.0\n max?: number;\n };\n\n // Price change filters\n priceChange24h?: {\n outcome: 'yes' | 'no' | 'up' | 'down';\n min?: number; // e.g., -0.1 for 10% drop\n max?: number;\n };\n}\n\nexport type MarketFilterFunction = (market: UnifiedMarket) => boolean;\n\nexport interface EventFilterCriteria {\n // Text search\n text?: string;\n searchIn?: ('title' | 'description' | 'category' | 'tags')[]; // Default: ['title']\n\n // Category/tag filters\n /** Filter by category. Common values: \"Sports\", \"Politics\", \"Crypto\", \"Bitcoin\", \"Soccer\", \"Economic Policy\" (Polymarket) or \"Sports\", \"Mentions\" (Kalshi). */\n category?: string;\n /** Match events that have ANY of these tags. Examples: [\"Crypto\"], [\"Politics\", \"Geopolitics\", \"Middle East\"], [\"Sports\", \"FIFA World Cup\"]. */\n tags?: string[];\n\n // Filter by contained markets\n marketCount?: { min?: number; max?: number };\n totalVolume?: { min?: number; max?: number }; // Sum of market volumes\n}\n\nexport type EventFilterFunction = (event: UnifiedEvent) => boolean;\n\n// ----------------------------------------------------------------------------\n// Capability Map (ccxt-style exchange.has)\n// ----------------------------------------------------------------------------\n\nexport type ExchangeCapability = true | false | 'emulated';\n\nexport interface ExchangeHas {\n /** Whether this exchange supports fetching markets. */\n fetchMarkets: ExchangeCapability;\n /** Whether this exchange supports fetching events. */\n fetchEvents: ExchangeCapability;\n /** Whether this exchange supports fetching OHLCV candles. */\n fetchOHLCV: ExchangeCapability;\n /** Whether this exchange supports fetching the order book. */\n fetchOrderBook: ExchangeCapability;\n /** Whether this exchange supports fetching multiple market order books. */\n fetchOrderBooks: ExchangeCapability;\n /** Whether this exchange supports fetching public trades. */\n fetchTrades: ExchangeCapability;\n /** Whether this exchange supports creating orders. */\n createOrder: ExchangeCapability;\n /** Whether this exchange supports cancelling orders. */\n cancelOrder: ExchangeCapability;\n /** Whether this exchange supports fetching a single order by id. */\n fetchOrder: ExchangeCapability;\n /** Whether this exchange supports fetching open orders. */\n fetchOpenOrders: ExchangeCapability;\n /** Whether this exchange supports fetching account positions. */\n fetchPositions: ExchangeCapability;\n /** Whether this exchange supports fetching account balances. */\n fetchBalance: ExchangeCapability;\n /** Whether this exchange supports subscribing to an on-chain address for updates. */\n watchAddress: ExchangeCapability;\n /** Whether this exchange supports unsubscribing from a watched address. */\n unwatchAddress: ExchangeCapability;\n /** Whether this exchange supports streaming order book updates. */\n watchOrderBook: ExchangeCapability;\n /** Whether this exchange supports batch-subscribing to multiple order book streams. */\n watchOrderBooks: ExchangeCapability;\n /** Whether this exchange supports unsubscribing from an order book stream. */\n unwatchOrderBook: ExchangeCapability;\n /** Whether this exchange supports streaming trade updates. */\n watchTrades: ExchangeCapability;\n /** Whether this exchange supports fetching the authenticated user's trade history. */\n fetchMyTrades: ExchangeCapability;\n /** Whether this exchange supports fetching closed orders. */\n fetchClosedOrders: ExchangeCapability;\n /** Whether this exchange supports fetching all orders (open and closed). */\n fetchAllOrders: ExchangeCapability;\n /** Whether this exchange supports building a signed order without submitting it. */\n buildOrder: ExchangeCapability;\n /** Whether this exchange supports submitting a pre-built order. */\n submitOrder: ExchangeCapability;\n /** Whether this exchange supports fetching cross-venue market matches. */\n fetchMarketMatches: ExchangeCapability;\n /** @deprecated Use {@link fetchMarketMatches} instead. */\n fetchMatches: ExchangeCapability;\n /** Whether this exchange supports fetching cross-venue event matches. */\n fetchEventMatches: ExchangeCapability;\n /** Whether this exchange supports comparing prices across venues. */\n compareMarketPrices: ExchangeCapability;\n /** Whether this exchange supports finding related markets across venues. */\n fetchRelatedMarkets: ExchangeCapability;\n /** Whether this exchange supports fetching matched markets across venues. */\n fetchMatchedMarkets: ExchangeCapability;\n /** @deprecated Use {@link fetchMatchedMarkets} instead. */\n fetchMatchedPrices: ExchangeCapability;\n /** @deprecated Use {@link fetchRelatedMarkets} instead. */\n fetchHedges: ExchangeCapability;\n /** @deprecated Use {@link fetchMatchedMarkets} instead. */\n fetchArbitrage: ExchangeCapability;\n}\n\n/**\nOptional authentication credentials for exchange operations.\n/\nexport interface ExchangeCredentials {\n // Standard API authentication (Kalshi, etc.)\n apiKey?: string;\n /** Standard API secret for HMAC-authenticated exchanges */\n apiSecret?: string;\n /** Standard API passphrase for HMAC-authenticated exchanges */\n passphrase?: string;\n /** Metaculus: `Authorization: Token ` for higher rate limits */\n apiToken?: string;\n\n // Blockchain-based authentication (Polymarket)\n privateKey?: string; // Required for Polymarket L1 auth\n\n // Polymarket-specific L2 fields\n signatureType?: number | string; // 0 = EOA, 1 = Poly Proxy, 2 = Gnosis Safe (Can also use 'eoa', 'polyproxy', 'gnosis_safe')\n funderAddress?: string; // The address funding the trades (defaults to signer address)\n\n // Limitless: wallet address for delegated signing profile lookup\n walletAddress?: string;\n\n // Optional base URL override for venue API (e.g., proxy for geo-restricted venues)\n baseUrl?: string;\n}\n\nexport interface ExchangeOptions {\n /**\nHow long (ms) a market snapshot created by `fetchMarketsPaginated` remains valid\nbefore being discarded and re-fetched from the API on the next call.\nDefaults to 0 (no TTL — the snapshot is re-fetched on every initial call).\n/\n snapshotTTL?: number;\n}\n\n/** Shape returned by fetchMarketsPaginated */\nexport interface PaginatedMarketsResult {\n /** The page of unified markets */\n data: UnifiedMarket[];\n /** Total number of markets in the snapshot */\n total: number;\n /** Cursor to pass to the next call, or undefined if this is the last page */\n nextCursor?: string;\n}\n\n/** Shape returned by fetchEventsPaginated */\nexport interface PaginatedEventsResult {\n /** The page of unified events */\n data: UnifiedEvent[];\n /** Total number of events in the snapshot */\n total: number;\n /** Cursor to pass to the next call, or undefined if this is the last page */\n nextCursor?: string;\n}\n\n// ----------------------------------------------------------------------------\n// Base Exchange Class\n// ----------------------------------------------------------------------------\n\nexport abstract class PredictionMarketExchange {\n [key: string]: any; // Allow dynamic method assignment for implicit API\n\n public verbose: boolean = false;\n public http: AxiosInstance;\n public enableRateLimit: boolean = true;\n // Market Cache\n public markets: Record = {};\n public marketsBySlug: Record = {};\n public loadedMarkets: boolean = false;\n /**\nCapability map derived automatically from method overrides at runtime.\nExchanges do NOT need to declare this manually -- if a subclass overrides\na method (and the override does not throw \"not supported\"), it is `true`.\nTo mark a capability as `'emulated'`, add its key to `emulatedCapabilities`.", "params": [], "returns": { "type": "ExchangeHas", @@ -13,13 +13,13 @@ }, "implicitApi": { "summary": "Override in subclasses to force specific capability values.", - "description": "Use `'emulated'` for methods backed by a non-native mechanism,\nor `false` for methods that override the base only to throw a\nbetter error message (e.g. \"pari-mutuel bets cannot be cancelled\").\n/\n protected readonly capabilityOverrides: Partial> = {};\n\n protected credentials?: ExchangeCredentials;\n // Implicit API (merged across multiple defineImplicitApi calls)\n protected apiDescriptor?: ApiDescriptor;\n private _throttler: Throttler;\n // Snapshot state for cursor-based pagination\n private _snapshotTTL: number;\n private _snapshot?: { markets: UnifiedMarket[]; takenAt: number; id: string };\n private _eventSnapshot?: { events: UnifiedEvent[]; takenAt: number; id: string };\n private apiDescriptors: ApiDescriptor[] = [];\n\n constructor(credentials?: ExchangeCredentials, options?: ExchangeOptions) {\n this.credentials = credentials;\n this._snapshotTTL = options?.snapshotTTL ?? 0;\n this.http = axios.create({\n headers: {\n 'User-Agent': `pmxt (https://github.com/pmxt-dev/pmxt)`\n }\n });\n this._throttler = new Throttler({\n refillRate: 1 / this._rateLimit,\n capacity: 1,\n delay: 1,\n });\n\n // Rate Limit Interceptor\n this.http.interceptors.request.use(async (config: InternalAxiosRequestConfig) => {\n if (this.enableRateLimit) {\n await this._throttler.throttle();\n }\n return config;\n });\n\n // Request Interceptor\n this.http.interceptors.request.use((config: InternalAxiosRequestConfig) => {\n if (this.verbose) {\n console.log(`\\n[pmxt] → ${config.method?.toUpperCase()} ${config.url}`);\n if (config.params) console.log('[pmxt] params:', config.params);\n if (config.data) console.log('[pmxt] body:', JSON.stringify(config.data, null, 2));\n }\n return config;\n });\n\n // Response Interceptor\n this.http.interceptors.response.use(\n (response: AxiosResponse) => {\n if (this.verbose) {\n console.log(`\\n[pmxt] ← ${response.status} ${response.statusText} ${response.config.url}`);\n // console.log('[pmxt] response:', JSON.stringify(response.data, null, 2));\n // Commented out full body log to avoid spam, but headers might be useful\n }\n return response;\n },\n (error: any) => {\n if (this.verbose) {\n console.log(`\\n[pmxt] ✖ REQUEST FAILED: ${error.config?.url}`);\n console.log('[pmxt] error:', error.message);\n if (error.response) {\n console.log('[pmxt] status:', error.response.status);\n console.log('[pmxt] data:', JSON.stringify(error.response.data, null, 2));\n }\n }\n return Promise.reject(error);\n }\n );\n }\n\n private _rateLimit: number = 1000;\n\n get rateLimit(): number {\n return this._rateLimit;\n }\n\n set rateLimit(value: number) {\n this._rateLimit = value;\n this._throttler = new Throttler({\n refillRate: 1 / value,\n capacity: 1,\n delay: 1,\n });\n }\n\n abstract get name(): string;\n\n /**\nIntrospection getter: returns info about all implicit API methods.", + "description": "Use `'emulated'` for methods backed by a non-native mechanism,\nor `false` for methods that override the base only to throw a\nbetter error message (e.g. \"pari-mutuel bets cannot be cancelled\").\n/\n protected readonly capabilityOverrides: Partial> = {};\n\n protected credentials?: ExchangeCredentials;\n // Implicit API (merged across multiple defineImplicitApi calls)\n protected apiDescriptor?: ApiDescriptor;\n private _throttler: Throttler;\n // Snapshot state for cursor-based pagination\n private _snapshotTTL: number;\n private _snapshot?: { markets: UnifiedMarket[]; takenAt: number; id: string };\n private _eventSnapshot?: { events: UnifiedEvent[]; takenAt: number; id: string };\n private apiDescriptors: ApiDescriptor[] = [];\n\n constructor(credentials?: ExchangeCredentials, options?: ExchangeOptions) {\n this.credentials = credentials;\n this._snapshotTTL = options?.snapshotTTL ?? 0;\n this.http = axios.create({\n headers: {\n 'User-Agent': `pmxt (https://github.com/pmxt-dev/pmxt)`\n },\n paramsSerializer: {\n serialize: (params) => {\n const sp = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined || v === null) continue;\n if (Array.isArray(v)) v.forEach((x) => sp.append(k, String(x)));\n else sp.append(k, String(v));\n }\n return sp.toString();\n },\n },\n });\n this._throttler = new Throttler({\n refillRate: 1 / this._rateLimit,\n capacity: 1,\n delay: 1,\n });\n\n // Rate Limit Interceptor\n this.http.interceptors.request.use(async (config: InternalAxiosRequestConfig) => {\n if (this.enableRateLimit) {\n await this._throttler.throttle();\n }\n return config;\n });\n\n // Request Interceptor\n this.http.interceptors.request.use((config: InternalAxiosRequestConfig) => {\n if (this.verbose) {\n console.log(`\\n[pmxt] → ${config.method?.toUpperCase()} ${config.url}`);\n if (config.params) console.log('[pmxt] params:', config.params);\n if (config.data) console.log('[pmxt] body:', JSON.stringify(config.data, null, 2));\n }\n return config;\n });\n\n // Response Interceptor\n this.http.interceptors.response.use(\n (response: AxiosResponse) => {\n if (this.verbose) {\n console.log(`\\n[pmxt] ← ${response.status} ${response.statusText} ${response.config.url}`);\n // console.log('[pmxt] response:', JSON.stringify(response.data, null, 2));\n // Commented out full body log to avoid spam, but headers might be useful\n }\n return response;\n },\n (error: any) => {\n if (this.verbose) {\n console.log(`\\n[pmxt] ✖ REQUEST FAILED: ${error.config?.url}`);\n console.log('[pmxt] error:', error.message);\n if (error.response) {\n console.log('[pmxt] status:', error.response.status);\n console.log('[pmxt] data:', JSON.stringify(error.response.data, null, 2));\n }\n }\n return Promise.reject(error);\n }\n );\n }\n\n private _rateLimit: number = 1000;\n\n get rateLimit(): number {\n return this._rateLimit;\n }\n\n set rateLimit(value: number) {\n this._rateLimit = value;\n this._throttler = new Throttler({\n refillRate: 1 / value,\n capacity: 1,\n delay: 1,\n });\n }\n\n abstract get name(): string;\n\n /**\nIntrospection getter: returns info about all implicit API methods.", "params": [], "returns": { "type": "ImplicitApiMethodInfo[]", "description": "Result" }, - "source": "BaseExchange.ts:390" + "source": "BaseExchange.ts:403" }, "loadMarkets": { "summary": "Load and cache all markets from the exchange into `this.markets` and `this.marketsBySlug`.", @@ -36,7 +36,7 @@ "type": "Record", "description": "Dictionary of markets indexed by marketId" }, - "source": "BaseExchange.ts:495" + "source": "BaseExchange.ts:519" }, "fetchMarkets": { "summary": "Fetch markets with optional filtering, search, or slug lookup.", @@ -83,7 +83,7 @@ "ordering — exchanges may reorder or add markets between requests. For stable iteration\nacross pages, use `loadMarkets()` and paginate over `Object.values(exchange.markets)`.", "Some exchanges (like Limitless) may only support status 'active' for search results." ], - "source": "BaseExchange.ts:532" + "source": "BaseExchange.ts:556" }, "fetchMarketsPaginated": { "summary": "Fetch markets with cursor-based pagination backed by a stable in-memory snapshot.", @@ -110,7 +110,7 @@ "type": "PaginatedMarketsResult", "description": "PaginatedMarketsResult with data, total, and optional nextCursor" }, - "source": "BaseExchange.ts:581" + "source": "BaseExchange.ts:605" }, "fetchEventsPaginated": { "summary": "Paginated variant of {@link fetchEvents}.", @@ -137,7 +137,7 @@ "type": "PaginatedEventsResult", "description": "PaginatedEventsResult with data, total, and optional nextCursor" }, - "source": "BaseExchange.ts:650" + "source": "BaseExchange.ts:674" }, "fetchEvents": { "summary": "Fetch events with optional keyword search.", @@ -175,7 +175,7 @@ "notes": [ "Some exchanges (like Limitless) may only support status 'active' for search results." ], - "source": "BaseExchange.ts:719" + "source": "BaseExchange.ts:743" }, "fetchMarket": { "summary": "Fetch a single market by lookup parameters.", @@ -192,7 +192,7 @@ "type": "UnifiedMarket", "description": "A single unified market" }, - "source": "BaseExchange.ts:754" + "source": "BaseExchange.ts:778" }, "fetchEvent": { "summary": "Fetch a single event by lookup parameters.", @@ -209,14 +209,14 @@ "type": "UnifiedEvent", "description": "A single unified event" }, - "source": "BaseExchange.ts:785" + "source": "BaseExchange.ts:809" }, "fetchOHLCV": { "summary": "Fetch historical OHLCV (candlestick) price data for a specific market outcome.", "description": "Fetch historical OHLCV (candlestick) price data for a specific market outcome.", "params": [ { - "name": "id", + "name": "outcomeId", "type": "string", "optional": false, "description": "The Outcome ID (outcomeId). Use outcome.outcomeId, NOT market.marketId" @@ -237,31 +237,54 @@ "Polymarket: outcomeId is the CLOB Token ID. Kalshi: outcomeId is the Market Ticker.", "Common resolutions: '1m' | '5m' | '15m' | '1h' | '6h' | '1d'. Arbitrary intervals (e.g. '30s', '120s', '3h') accepted by venues that support them." ], - "source": "BaseExchange.ts:802" + "source": "BaseExchange.ts:826" }, "fetchOrderBook": { "summary": "Fetch the current order book (bids/asks) for a specific outcome.", "description": "Essential for calculating spread, depth, and execution prices.", "params": [ { - "name": "id", + "name": "outcomeId", "type": "string", "optional": false, - "description": "The Outcome ID (outcomeId)" + "description": "The Outcome ID (outcomeId) or market slug" + }, + { + "name": "side", + "type": "'yes' | 'no'", + "optional": true, + "description": "Optional 'yes' or 'no' to explicitly indicate the" } ], "returns": { "type": "OrderBook", "description": "Current order book with bids and asks" }, - "source": "BaseExchange.ts:817" + "source": "BaseExchange.ts:841" + }, + "fetchOrderBooks": { + "summary": "Batch variant of {@link fetchOrderBook}. Fetches order books for", + "description": "multiple outcomes in a single request where the exchange supports it.", + "params": [ + { + "name": "outcomeIds", + "type": "string[]", + "optional": false, + "description": "List of Outcome IDs (outcomeId). Each id must be in the" + } + ], + "returns": { + "type": "Record", + "description": "A map keyed by the input id (preserving the caller's exact" + }, + "source": "BaseExchange.ts:856" }, "fetchTrades": { "summary": "Fetch raw trade history for a specific outcome.", "description": "Fetch raw trade history for a specific outcome.", "params": [ { - "name": "id", + "name": "outcomeId", "type": "string", "optional": false, "description": "The Outcome ID (outcomeId)" @@ -280,7 +303,7 @@ "notes": [ "Polymarket requires an API key for trade history. Use fetchOHLCV for public historical data." ], - "source": "BaseExchange.ts:828" + "source": "BaseExchange.ts:869" }, "createOrder": { "summary": "Place a new order on the exchange.", @@ -297,7 +320,7 @@ "type": "Order", "description": "The created order" }, - "source": "BaseExchange.ts:848" + "source": "BaseExchange.ts:889" }, "buildOrder": { "summary": "Build an order payload without submitting it to the exchange.", @@ -314,7 +337,7 @@ "type": "BuiltOrder", "description": "A BuiltOrder containing the exchange-native payload" }, - "source": "BaseExchange.ts:862" + "source": "BaseExchange.ts:903" }, "submitOrder": { "summary": "Submit a pre-built order returned by buildOrder().", @@ -331,7 +354,7 @@ "type": "Order", "description": "The submitted order" }, - "source": "BaseExchange.ts:874" + "source": "BaseExchange.ts:915" }, "cancelOrder": { "summary": "Cancel an existing open order.", @@ -348,7 +371,7 @@ "type": "Order", "description": "The cancelled order" }, - "source": "BaseExchange.ts:884" + "source": "BaseExchange.ts:925" }, "fetchOrder": { "summary": "Fetch a specific order by ID.", @@ -365,7 +388,7 @@ "type": "Order", "description": "The order details" }, - "source": "BaseExchange.ts:894" + "source": "BaseExchange.ts:935" }, "fetchOpenOrders": { "summary": "Fetch all open orders, optionally filtered by market.", @@ -382,7 +405,7 @@ "type": "Order[]", "description": "Array of open orders" }, - "source": "BaseExchange.ts:904" + "source": "BaseExchange.ts:945" }, "fetchPositions": { "summary": "Fetch current user positions across all markets.", @@ -399,7 +422,7 @@ "type": "Position[]", "description": "Array of user positions" }, - "source": "BaseExchange.ts:926" + "source": "BaseExchange.ts:967" }, "fetchBalance": { "summary": "Fetch account balances.", @@ -416,7 +439,7 @@ "type": "Balance[]", "description": "Array of account balances" }, - "source": "BaseExchange.ts:936" + "source": "BaseExchange.ts:977" }, "getExecutionPrice": { "summary": "Calculate the volume-weighted average execution price for a given order size.", @@ -445,7 +468,7 @@ "type": "number", "description": "Average execution price, or 0 if insufficient liquidity" }, - "source": "BaseExchange.ts:946" + "source": "BaseExchange.ts:987" }, "getExecutionPriceDetailed": { "summary": "Calculate detailed execution price information including partial fill data.", @@ -474,7 +497,7 @@ "type": "ExecutionPriceResult", "description": "Detailed execution result with price, filled amount, and fill status" }, - "source": "BaseExchange.ts:959" + "source": "BaseExchange.ts:1000" }, "filterMarkets": { "summary": "Filter a list of markets by criteria.", @@ -497,7 +520,7 @@ "type": "UnifiedMarket[]", "description": "Filtered array of markets" }, - "source": "BaseExchange.ts:975" + "source": "BaseExchange.ts:1016" }, "filterEvents": { "summary": "Filter a list of events by criteria.", @@ -520,14 +543,14 @@ "type": "UnifiedEvent[]", "description": "Filtered array of events" }, - "source": "BaseExchange.ts:1134" + "source": "BaseExchange.ts:1175" }, "watchOrderBook": { "summary": "Watch order book updates in real-time via WebSocket.", "description": "Returns a promise that resolves with the next order book update. Call repeatedly in a loop to stream updates (CCXT Pro pattern).", "params": [ { - "name": "id", + "name": "outcomeId", "type": "string", "optional": false, "description": "The Outcome ID to watch" @@ -543,14 +566,14 @@ "type": "OrderBook", "description": "Promise that resolves with the current orderbook state" }, - "source": "BaseExchange.ts:1230" + "source": "BaseExchange.ts:1271" }, "watchOrderBooks": { "summary": "Watch multiple order books simultaneously via WebSocket.", "description": "Returns a promise that resolves with a record of order book snapshots keyed by ID.\nExchanges with native batch support (e.g. Kalshi) send a single subscribe message\nfor all tickers; others fall back to individual watchOrderBook calls.", "params": [ { - "name": "ids", + "name": "outcomeIds", "type": "string[]", "optional": false, "description": "Array of Outcome IDs to watch" @@ -566,14 +589,14 @@ "type": "Record", "description": "Promise that resolves with order books keyed by ID" }, - "source": "BaseExchange.ts:1242" + "source": "BaseExchange.ts:1283" }, "unwatchOrderBook": { "summary": "Unsubscribe from a previously watched order book stream.", "description": "Unsubscribe from a previously watched order book stream.", "params": [ { - "name": "id", + "name": "outcomeId", "type": "string", "optional": false, "description": "The Outcome ID to stop watching" @@ -583,14 +606,14 @@ "type": "void", "description": "Result" }, - "source": "BaseExchange.ts:1269" + "source": "BaseExchange.ts:1310" }, "watchTrades": { "summary": "Watch trade executions in real-time via WebSocket.", "description": "Returns a promise that resolves with the next trade(s). Call repeatedly in a loop to stream updates (CCXT Pro pattern).", "params": [ { - "name": "id", + "name": "outcomeId", "type": "string", "optional": false, "description": "The Outcome ID to watch" @@ -618,7 +641,7 @@ "type": "Trade[]", "description": "Promise that resolves with recent trades" }, - "source": "BaseExchange.ts:1282" + "source": "BaseExchange.ts:1323" }, "watchAddress": { "summary": "Stream activity for a public wallet address", @@ -641,7 +664,7 @@ "type": "SubscribedAddressSnapshot", "description": "Promise that resolves with the latest SubscribedAddressSnapshot snapshot" }, - "source": "BaseExchange.ts:1296" + "source": "BaseExchange.ts:1337" }, "unwatchAddress": { "summary": "Stop watching a previously registered wallet address and release its resource updates.", @@ -658,17 +681,24 @@ "type": "void", "description": "Result" }, - "source": "BaseExchange.ts:1309" + "source": "BaseExchange.ts:1350" }, - "close": { + "testDummyMethod": { "summary": "Close all WebSocket connections and clean up resources.", - "description": "Call this when you're done streaming to properly release connections.", - "params": [], + "description": "Call this when you're done streaming to properly release connections.\n/\n\n /**\nTest method for auto-generation verification.", + "params": [ + { + "name": "param", + "type": "string", + "optional": true, + "description": "param" + } + ], "returns": { - "type": "void", + "type": "string", "description": "Result" }, - "source": "BaseExchange.ts:1318" + "source": "BaseExchange.ts:1359" }, "fetchMarketMatches": { "summary": "Find the same or related market on other venues. Two modes:", @@ -685,7 +715,7 @@ "type": "MatchResult[]", "description": "Array of matched markets with relation and confidence" }, - "source": "BaseExchange.ts:1331" + "source": "BaseExchange.ts:1380" }, "fetchMatches": { "summary": "fetchMatches", @@ -702,7 +732,7 @@ "type": "MatchResult[]", "description": "Result" }, - "source": "BaseExchange.ts:1347" + "source": "BaseExchange.ts:1396" }, "fetchEventMatches": { "summary": "Find the same or related event on other venues. Two modes:", @@ -719,7 +749,7 @@ "type": "EventMatchResult[]", "description": "Array of matched events with market-level match details" }, - "source": "BaseExchange.ts:1355" + "source": "BaseExchange.ts:1404" }, "compareMarketPrices": { "summary": "Compare live prices for the same market across venues. Finds identity matches and returns side-by-side best bid/ask prices so you can spot price differences at a glance.", @@ -736,7 +766,7 @@ "type": "PriceComparison[]", "description": "Array of price comparisons across venues" }, - "source": "BaseExchange.ts:1371" + "source": "BaseExchange.ts:1420" }, "fetchRelatedMarkets": { "summary": "Find related markets across venues. Discovers subset/superset market relationships", @@ -753,7 +783,7 @@ "type": "PriceComparison[]", "description": "Array of subset/superset matches with live prices" }, - "source": "BaseExchange.ts:1381" + "source": "BaseExchange.ts:1430" }, "fetchMatchedMarkets": { "summary": "fetchMatchedMarkets", @@ -770,7 +800,7 @@ "type": "MatchedMarketPair[]", "description": "Result" }, - "source": "BaseExchange.ts:1392" + "source": "BaseExchange.ts:1441" }, "fetchMatchedPrices": { "summary": "fetchMatchedPrices", @@ -787,7 +817,7 @@ "type": "MatchedPricePair[]", "description": "Array of matched market pairs with prices from each venue" }, - "source": "BaseExchange.ts:1400" + "source": "BaseExchange.ts:1449" }, "fetchHedges": { "summary": "fetchHedges", @@ -804,7 +834,7 @@ "type": "PriceComparison[]", "description": "Array of subset/superset matches with live prices" }, - "source": "BaseExchange.ts:1411" + "source": "BaseExchange.ts:1460" }, "fetchArbitrage": { "summary": "fetchArbitrage", @@ -821,7 +851,7 @@ "type": "ArbitrageOpportunity[]", "description": "Array of arbitrage opportunities sorted by spread" }, - "source": "BaseExchange.ts:1421" + "source": "BaseExchange.ts:1470" }, "watchPrices": { "summary": "Watch AMM price updates for a market address (Limitless only).", @@ -845,7 +875,7 @@ "description": "Result" }, "exchangeOnly": "limitless", - "source": "index.ts:425" + "source": "index.ts:465" }, "watchUserPositions": { "summary": "Watch user positions in real-time (Limitless only).", @@ -863,7 +893,7 @@ "description": "Result" }, "exchangeOnly": "limitless", - "source": "index.ts:437" + "source": "index.ts:477" }, "watchUserTransactions": { "summary": "Watch user transactions in real-time (Limitless only).", @@ -881,7 +911,7 @@ "description": "Result" }, "exchangeOnly": "limitless", - "source": "index.ts:449" + "source": "index.ts:489" }, "initAuth": { "summary": "Initialize L2 API credentials for implicit API signing.", @@ -892,7 +922,7 @@ "description": "Result" }, "exchangeOnly": "polymarket", - "source": "index.ts:133" + "source": "index.ts:136" }, "preWarmMarket": { "summary": "Pre-warm the SDK's internal caches for a market outcome.", @@ -910,7 +940,7 @@ "description": "Result" }, "exchangeOnly": "polymarket", - "source": "index.ts:183" + "source": "index.ts:201" }, "getEventById": { "summary": "Fetch a single event by its numeric ID (Probable only).", @@ -928,7 +958,7 @@ "description": "The UnifiedEvent, or null if not found" }, "exchangeOnly": "probable", - "source": "index.ts:140" + "source": "index.ts:141" }, "getEventBySlug": { "summary": "Fetch a single event by its URL slug (Probable only).", @@ -946,7 +976,7 @@ "description": "The UnifiedEvent, or null if not found" }, "exchangeOnly": "probable", - "source": "index.ts:159" + "source": "index.ts:160" } }, "workflowExample": { diff --git a/core/specs/kalshi/Kalshi.yaml b/core/specs/kalshi/Kalshi.yaml index fc5109ab..f9735c23 100644 --- a/core/specs/kalshi/Kalshi.yaml +++ b/core/specs/kalshi/Kalshi.yaml @@ -2068,6 +2068,56 @@ paths: '500': $ref: '#/components/responses/InternalServerError' + /markets/orderbooks: + get: + operationId: GetMarketOrderbooks + summary: Get Multiple Market Orderbooks + description: >- + Endpoint for getting the current order books for multiple markets in a + single request. The order book shows all active bid orders for both yes + and no sides of a binary market. It returns yes bids and no bids only + (no asks are returned). This is because in binary markets, a bid for yes + at price X is equivalent to an ask for no at price (100-X). For example, + a yes bid at 7¢ is the same as a no ask at 93¢, with identical contract + sizes. Each side shows price levels with their corresponding quantities + and order counts, organized from best to worst prices. Returns one + orderbook per requested market ticker. + tags: + - market + security: + - kalshiAccessKey: [] + kalshiAccessSignature: [] + kalshiAccessTimestamp: [] + parameters: + - name: tickers + in: query + required: true + description: List of market tickers to fetch orderbooks for + schema: + type: array + items: + type: string + maxLength: 200 + minItems: 1 + maxItems: 100 + style: form + explode: true + x-oapi-codegen-extra-tags: + validate: required,min=1,max=100,dive,max=200 + responses: + '200': + description: Orderbooks retrieved successfully + content: + application/json: + schema: + $ref: '#/components/schemas/GetMarketOrderbooksResponse' + '400': + $ref: '#/components/responses/BadRequestError' + '401': + $ref: '#/components/responses/UnauthorizedError' + '500': + $ref: '#/components/responses/InternalServerError' + /milestones/{milestone_id}: get: operationId: GetMilestone @@ -6041,6 +6091,27 @@ components: $ref: '#/components/schemas/OrderbookCountFp' description: Orderbook with fixed-point contract counts (fp) in all price levels. + GetMarketOrderbooksResponse: + type: object + required: + - orderbooks + properties: + orderbooks: + type: array + items: + $ref: '#/components/schemas/MarketOrderbookFp' + + MarketOrderbookFp: + type: object + required: + - ticker + - orderbook_fp + properties: + ticker: + type: string + orderbook_fp: + $ref: '#/components/schemas/OrderbookCountFp' + GetEventsResponse: type: object required: diff --git a/core/src/BaseExchange.ts b/core/src/BaseExchange.ts index fe90c727..3ae9cc1b 100644 --- a/core/src/BaseExchange.ts +++ b/core/src/BaseExchange.ts @@ -258,6 +258,8 @@ export interface ExchangeHas { fetchOHLCV: ExchangeCapability; /** Whether this exchange supports fetching the order book. */ fetchOrderBook: ExchangeCapability; + /** Whether this exchange supports fetching multiple market order books. */ + fetchOrderBooks: ExchangeCapability; /** Whether this exchange supports fetching public trades. */ fetchTrades: ExchangeCapability; /** Whether this exchange supports creating orders. */ @@ -422,7 +424,18 @@ export abstract class PredictionMarketExchange { this.http = axios.create({ headers: { 'User-Agent': `pmxt (https://github.com/pmxt-dev/pmxt)` - } + }, + paramsSerializer: { + serialize: (params) => { + const sp = new URLSearchParams(); + for (const [k, v] of Object.entries(params)) { + if (v === undefined || v === null) continue; + if (Array.isArray(v)) v.forEach((x) => sp.append(k, String(x))); + else sp.append(k, String(v)); + } + return sp.toString(); + }, + }, }); this._throttler = new Throttler({ refillRate: 1 / this._rateLimit, @@ -840,6 +853,19 @@ export abstract class PredictionMarketExchange { throw new Error("Method fetchOrderBook not implemented."); } + /** + * Batch variant of {@link fetchOrderBook}. Fetches order books for + * multiple outcomes in a single request where the exchange supports it. + * + * @param outcomeIds - List of Outcome IDs (outcomeId). Each id must be in the + * exchange's native format; market slugs are not accepted here. + * @returns A map keyed by the input id (preserving the caller's exact + * string) to its order book. Throws `NotFound` if any id has no book. + */ + async fetchOrderBooks(outcomeIds: string[]): Promise> { + throw new Error("Method fetchOrderBooks not implemented."); + } + /** * Fetch raw trade history for a specific outcome. * @@ -1334,7 +1360,7 @@ export abstract class PredictionMarketExchange { * Close all WebSocket connections and clean up resources. * Call this when you're done streaming to properly release connections. */ - + /** * Test method for auto-generation verification. */ @@ -1477,7 +1503,7 @@ export abstract class PredictionMarketExchange { * Provides a typed entry point so unified methods can delegate to the implicit API * without casting to `any` everywhere. */ - protected async callApi(operationId: string, params?: Record): Promise { + protected async callApi(operationId: string, params?: Record | any[]): Promise { const method = (this as any)[operationId]; if (typeof method !== 'function') { throw new Error(`Implicit API method "${operationId}" not found on ${this.name}`); @@ -1535,9 +1561,10 @@ export abstract class PredictionMarketExchange { name: string, endpoint: ApiEndpoint, resolvedBaseUrl: string - ): (params?: Record) => Promise { - return async (params?: Record): Promise => { - const allParams = { ...(params || {}) }; + ): (params?: Record | any[]) => Promise { + return async (params?: Record | any[]): Promise => { + const isArray = Array.isArray(params); + const allParams: Record = isArray ? {} : { ...(params || {}) }; // Substitute path parameters like {ticker} from params let resolvedPath = endpoint.path.replace(/\{([^}]+)\}/g, (_match, key) => { @@ -1572,11 +1599,15 @@ export abstract class PredictionMarketExchange { headers, }); } else { - // POST/PUT/PATCH: remaining params go to JSON body + // POST/PUT/PATCH: array payloads go through as-is; object + // payloads send remaining params. + const body = isArray + ? params + : (Object.keys(allParams).length > 0 ? allParams : undefined); response = await this.http.request({ method: method as any, url, - data: Object.keys(allParams).length > 0 ? allParams : undefined, + data: body, headers: { 'Content-Type': 'application/json', ...headers }, }); } @@ -1594,7 +1625,7 @@ export abstract class PredictionMarketExchange { /** All keys that appear in ExchangeHas -- kept in sync via the exhaustive check below. */ private static readonly _capabilityKeys: readonly (keyof ExchangeHas)[] = [ - 'fetchMarkets', 'fetchEvents', 'fetchOHLCV', 'fetchOrderBook', + 'fetchMarkets', 'fetchEvents', 'fetchOHLCV', 'fetchOrderBook', 'fetchOrderBooks', 'fetchTrades', 'createOrder', 'cancelOrder', 'fetchOrder', 'fetchOpenOrders', 'fetchPositions', 'fetchBalance', 'watchAddress', 'unwatchAddress', 'watchOrderBook', 'watchOrderBooks', @@ -1608,7 +1639,7 @@ export abstract class PredictionMarketExchange { // ExchangeHas but is missing from _capabilityKeys above. private static readonly _exhaustiveCheck: Record = { fetchMarkets: true, fetchEvents: true, fetchOHLCV: true, - fetchOrderBook: true, fetchTrades: true, createOrder: true, + fetchOrderBook: true, fetchOrderBooks: true, fetchTrades: true, createOrder: true, cancelOrder: true, fetchOrder: true, fetchOpenOrders: true, fetchPositions: true, fetchBalance: true, watchAddress: true, unwatchAddress: true, watchOrderBook: true, watchOrderBooks: true, unwatchOrderBook: true, diff --git a/core/src/exchanges/kalshi/api.ts b/core/src/exchanges/kalshi/api.ts index 2ce7420b..ba9b1a9b 100644 --- a/core/src/exchanges/kalshi/api.ts +++ b/core/src/exchanges/kalshi/api.ts @@ -1,6 +1,6 @@ /** - * Auto-generated from /Users/ndmeiri/Developer/pmxt/core/specs/kalshi/Kalshi.yaml - * Generated at: 2026-04-21T22:01:26.550Z + * Auto-generated from /home/zihao/pmxt/core/specs/kalshi/Kalshi.yaml + * Generated at: 2026-05-10T23:00:51.402Z * Do not edit manually -- run "npm run fetch:openapi" to regenerate. */ export const kalshiApiSpec = { @@ -1735,6 +1735,43 @@ export const kalshiApiSpec = { ] } }, + "/markets/orderbooks": { + "get": { + "operationId": "GetMarketOrderbooks", + "summary": "Get Multiple Market Orderbooks", + "tags": [ + "market" + ], + "security": [ + { + "kalshiAccessKey": [], + "kalshiAccessSignature": [], + "kalshiAccessTimestamp": [] + } + ], + "parameters": [ + { + "name": "tickers", + "in": "query", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "string", + "maxLength": 200 + }, + "minItems": 1, + "maxItems": 100 + }, + "style": "form", + "explode": true, + "x-oapi-codegen-extra-tags": { + "validate": "required,min=1,max=100,dive,max=200" + } + } + ] + } + }, "/milestones/{milestone_id}": { "get": { "operationId": "GetMilestone", diff --git a/core/src/exchanges/kalshi/fetcher.ts b/core/src/exchanges/kalshi/fetcher.ts index f789664b..2240057d 100644 --- a/core/src/exchanges/kalshi/fetcher.ts +++ b/core/src/exchanges/kalshi/fetcher.ts @@ -1,5 +1,5 @@ -import { MarketFilterParams, EventFetchParams, OHLCVParams, TradesParams, MyTradesParams } from '../../BaseExchange'; -import { IExchangeFetcher, FetcherContext } from '../interfaces'; +import { EventFetchParams, MarketFilterParams, MyTradesParams, OHLCVParams, TradesParams } from '../../BaseExchange'; +import { FetcherContext, IExchangeFetcher } from '../interfaces'; import { kalshiErrorMapper } from './errors'; import { NotFound } from '../../errors'; import { validateIdFormat } from '../../utils/validation'; @@ -31,6 +31,7 @@ export interface KalshiRawMarket { volume_fp?: string; open_interest_fp?: string; close_time?: string; + [key: string]: unknown; } @@ -43,6 +44,7 @@ export interface KalshiRawEvent { tags?: string[]; series_ticker?: string; markets?: KalshiRawMarket[]; + [key: string]: unknown; } @@ -52,6 +54,7 @@ export interface KalshiRawCandlestick { price?: { open?: number; high?: number; low?: number; close?: number; previous?: number }; yes_ask?: { open?: number; high?: number; low?: number; close?: number }; yes_bid?: { open?: number; high?: number; low?: number; close?: number }; + [key: string]: unknown; } @@ -60,6 +63,15 @@ export interface KalshiRawOrderBookFp { no_dollars?: string[][]; } +export interface KalshiRawOrderBook { + ticker: string; + orderbook_fp: KalshiRawOrderBookFp; +} + +export interface KalshiRawOrderBooks { + orderbooks: KalshiRawOrderBook[]; +} + export interface KalshiRawTrade { trade_id: string; created_time: string; @@ -72,6 +84,7 @@ export interface KalshiRawTrade { /** New API field: count as a string e.g. "424.00" */ count_fp?: string; taker_side: string; + [key: string]: unknown; } @@ -86,6 +99,7 @@ export interface KalshiRawFill { count_fp?: string; side: string; order_id: string; + [key: string]: unknown; } @@ -99,6 +113,7 @@ export interface KalshiRawOrder { remaining_count?: number; status?: string; created_time: string; + [key: string]: unknown; } @@ -109,6 +124,7 @@ export interface KalshiRawPosition { market_price?: number; market_exposure?: number; realized_pnl?: number; + [key: string]: unknown; } @@ -255,7 +271,7 @@ export class KalshiFetcher implements IExchangeFetcher { + async fetchRawOrderBook(id: string): Promise { validateIdFormat(id, 'OrderBook'); const ticker = id.replace(/-NO$/, ''); const data = await this.ctx.callApi('GetMarketOrderbook', { ticker }); @@ -266,6 +282,19 @@ export class KalshiFetcher implements IExchangeFetcher { + ids.forEach((id) => validateIdFormat(id, 'OrderBook')); + const tickers = [...new Set(ids.map(id => id.replace(/-NO$/, '')))]; + const data: KalshiRawOrderBooks = await this.ctx.callApi('GetMarketOrderbooks', { tickers }); + const orderBooks = data.orderbooks; + if (tickers.length !== orderBooks.length) { + const returned = new Set(orderBooks.map(item => item.ticker)); + const missing = tickers.filter(t => !returned.has(t)); + throw new NotFound(`Order book not found for tickers ${missing.join(', ')}`, 'Kalshi'); + } + return orderBooks; + } + // -- Trades ---------------------------------------------------------------- async fetchRawTrades(id: string, params: TradesParams): Promise { diff --git a/core/src/exchanges/kalshi/index.ts b/core/src/exchanges/kalshi/index.ts index 14db0d60..462b216e 100644 --- a/core/src/exchanges/kalshi/index.ts +++ b/core/src/exchanges/kalshi/index.ts @@ -1,394 +1,403 @@ import { - PredictionMarketExchange, - MarketFilterParams, - HistoryFilterParams, - OHLCVParams, - TradesParams, - ExchangeCredentials, - EventFetchParams, - MyTradesParams, - OrderHistoryParams, -} from "../../BaseExchange"; + EventFetchParams, + ExchangeCredentials, + HistoryFilterParams, + MarketFilterParams, + MyTradesParams, + OHLCVParams, + OrderHistoryParams, + PredictionMarketExchange, + TradesParams, +} from '../../BaseExchange'; +import { AuthenticationError } from '../../errors'; import { - UnifiedMarket, - UnifiedEvent, - PriceCandle, - OrderBook, - Trade, - UserTrade, - Balance, - Order, - Position, - CreateOrderParams, - BuiltOrder, -} from "../../types"; -import { KalshiAuth } from "./auth"; -import { validateIdFormat } from "../../utils/validation"; -import { KalshiWebSocket, KalshiWebSocketConfig } from "./websocket"; -import { kalshiErrorMapper } from "./errors"; -import { AuthenticationError } from "../../errors"; -import { parseOpenApiSpec } from "../../utils/openapi"; -import { kalshiApiSpec } from "./api"; -import { getKalshiConfig, KalshiApiConfig, KALSHI_PATHS } from "./config"; -import { KalshiFetcher } from "./fetcher"; -import { KalshiNormalizer, sortRawEvents } from "./normalizer"; -import { FetcherContext } from "../interfaces"; + Balance, + BuiltOrder, + CreateOrderParams, + Order, + OrderBook, + Position, + PriceCandle, + Trade, + UnifiedEvent, + UnifiedMarket, + UserTrade, +} from '../../types'; +import { parseOpenApiSpec } from '../../utils/openapi'; +import { FetcherContext } from '../interfaces'; +import { kalshiApiSpec } from './api'; +import { KalshiAuth } from './auth'; +import { getKalshiConfig, KALSHI_PATHS, KalshiApiConfig } from './config'; +import { kalshiErrorMapper } from './errors'; +import { KalshiFetcher } from './fetcher'; +import { KalshiNormalizer, sortRawEvents } from './normalizer'; +import { KalshiWebSocket, KalshiWebSocketConfig } from './websocket'; // Re-export for external use export type { KalshiWebSocketConfig }; export interface KalshiExchangeOptions { - credentials?: ExchangeCredentials; - websocket?: KalshiWebSocketConfig; + credentials?: ExchangeCredentials; + websocket?: KalshiWebSocketConfig; } /** @internal */ export interface KalshiInternalOptions extends KalshiExchangeOptions { - demoMode?: boolean; + demoMode?: boolean; } export class KalshiExchange extends PredictionMarketExchange { - private auth?: KalshiAuth; - private wsConfig?: KalshiWebSocketConfig; - private config: KalshiApiConfig; - private readonly fetcher: KalshiFetcher; - private readonly normalizer: KalshiNormalizer; - - constructor(options?: ExchangeCredentials | KalshiExchangeOptions) { - let credentials: ExchangeCredentials | undefined; - let wsConfig: KalshiWebSocketConfig | undefined; - let demoMode = false; - - if (options && "credentials" in options) { - credentials = options.credentials; - wsConfig = options.websocket; - demoMode = (options as KalshiInternalOptions).demoMode || false; - } else { - credentials = options as ExchangeCredentials | undefined; + private auth?: KalshiAuth; + private wsConfig?: KalshiWebSocketConfig; + private config: KalshiApiConfig; + private readonly fetcher: KalshiFetcher; + private readonly normalizer: KalshiNormalizer; + + constructor(options?: ExchangeCredentials | KalshiExchangeOptions) { + let credentials: ExchangeCredentials | undefined; + let wsConfig: KalshiWebSocketConfig | undefined; + let demoMode = false; + + if (options && 'credentials' in options) { + credentials = options.credentials; + wsConfig = options.websocket; + demoMode = (options as KalshiInternalOptions).demoMode || false; + } else { + credentials = options as ExchangeCredentials | undefined; + } + + super(credentials); + this.rateLimit = 100; + this.wsConfig = wsConfig; + this.config = getKalshiConfig(demoMode, credentials?.baseUrl); + + if (credentials?.apiKey && credentials?.privateKey) { + this.auth = new KalshiAuth(credentials); + } + + const descriptor = parseOpenApiSpec( + kalshiApiSpec, + this.config.apiUrl + KALSHI_PATHS.TRADE_API, + ); + this.defineImplicitApi(descriptor); + + const ctx: FetcherContext = { + http: this.http, + callApi: this.callApi.bind(this), + getHeaders: () => ({}), + }; + + this.fetcher = new KalshiFetcher(ctx); + this.normalizer = new KalshiNormalizer(); } - super(credentials); - this.rateLimit = 100; - this.wsConfig = wsConfig; - this.config = getKalshiConfig(demoMode, credentials?.baseUrl); + get name(): string { + return 'Kalshi'; + } + + // ---------------------------------------------------------------------------- + // Implicit API Auth & Error Mapping + // ---------------------------------------------------------------------------- + + protected override sign( + method: string, + path: string, + _params: Record, + ): Record { + const auth = this.ensureAuth(); + return auth.getHeaders(method, '/trade-api/v2' + path); + } + + protected override mapImplicitApiError(error: any): any { + throw kalshiErrorMapper.mapError(error); + } + + private ensureAuth(): KalshiAuth { + if (!this.auth) { + throw new AuthenticationError( + 'Trading operations require authentication. ' + + 'Initialize KalshiExchange with credentials (apiKey and privateKey).', + 'Kalshi', + ); + } + return this.auth; + } + + // ---------------------------------------------------------------------------- + // Market Data (fetcher -> normalizer) + // ---------------------------------------------------------------------------- + + protected async fetchMarketsImpl( + params?: MarketFilterParams, + ): Promise { + const rawEvents = await this.fetcher.fetchRawMarkets(params); + + const allMarkets: UnifiedMarket[] = []; + for (const event of rawEvents) { + const markets = this.normalizer.normalizeMarketsFromEvent(event); + allMarkets.push(...markets); + } + + // Query-based search (client-side filtering) + if (params?.query) { + const lowerQuery = params.query.toLowerCase(); + const searchIn = params?.searchIn || 'title'; + const filtered = allMarkets.filter((market) => { + const titleMatch = (market.title || '').toLowerCase().includes(lowerQuery); + const descMatch = (market.description || '').toLowerCase().includes(lowerQuery); + if (searchIn === 'title') return titleMatch; + if (searchIn === 'description') return descMatch; + return titleMatch || descMatch; + }); + return filtered.slice(0, params?.limit || 250000); + } + + // Client-side sort + if (params?.sort === 'volume') { + allMarkets.sort((a, b) => b.volume24h - a.volume24h); + } else if (params?.sort === 'liquidity') { + allMarkets.sort((a, b) => b.liquidity - a.liquidity); + } + + const offset = params?.offset || 0; + const limit = params?.limit || 250000; + return allMarkets.slice(offset, offset + limit); + } + + protected async fetchEventsImpl( + params: EventFetchParams, + ): Promise { + const rawEvents = await this.fetcher.fetchRawEvents(params); + const limit = params?.limit || 250000; + const query = (params?.query || '').toLowerCase(); + + const filtered = query + ? rawEvents.filter((event) => (event.title || '').toLowerCase().includes(query)) + : rawEvents; + + const sort = params?.sort || 'volume'; + const sorted = sortRawEvents(filtered, sort); + + return sorted + .map((raw) => this.normalizer.normalizeEvent(raw)) + .filter((e): e is UnifiedEvent => e !== null) + .slice(0, limit); + } + + async fetchOHLCV( + outcomeId: string, + params: OHLCVParams, + ): Promise { + const rawCandles = await this.fetcher.fetchRawOHLCV(outcomeId, params); + return this.normalizer.normalizeOHLCV(rawCandles, params); + } + + async fetchOrderBook(outcomeId: string): Promise { + const raw = await this.fetcher.fetchRawOrderBook(outcomeId); + return this.normalizer.normalizeOrderBook(raw, outcomeId); + } - if (credentials?.apiKey && credentials?.privateKey) { - this.auth = new KalshiAuth(credentials); + async fetchOrderBooks(outcomeIds: string[]): Promise> { + const raw = await this.fetcher.fetchRawOrderBooks(outcomeIds); + const byTicker = new Map(raw.map(ob => [ob.ticker, ob])); + const response: Record = {}; + outcomeIds.forEach((outcomeId) => { + const ob = byTicker.get(outcomeId.replace(/-NO$/, '')); + if (ob) response[outcomeId] = this.normalizer.normalizeOrderBook(ob, outcomeId); + }); + return response; } - const descriptor = parseOpenApiSpec( - kalshiApiSpec, - this.config.apiUrl + KALSHI_PATHS.TRADE_API, - ); - this.defineImplicitApi(descriptor); - - const ctx: FetcherContext = { - http: this.http, - callApi: this.callApi.bind(this), - getHeaders: () => ({}), - }; - - this.fetcher = new KalshiFetcher(ctx); - this.normalizer = new KalshiNormalizer(); - } - - get name(): string { - return "Kalshi"; - } - - // ---------------------------------------------------------------------------- - // Implicit API Auth & Error Mapping - // ---------------------------------------------------------------------------- - - protected override sign( - method: string, - path: string, - _params: Record, - ): Record { - const auth = this.ensureAuth(); - return auth.getHeaders(method, "/trade-api/v2" + path); - } - - protected override mapImplicitApiError(error: any): any { - throw kalshiErrorMapper.mapError(error); - } - - private ensureAuth(): KalshiAuth { - if (!this.auth) { - throw new AuthenticationError( - "Trading operations require authentication. " + - "Initialize KalshiExchange with credentials (apiKey and privateKey).", - "Kalshi", - ); + async fetchTrades( + outcomeId: string, + params: TradesParams | HistoryFilterParams, + ): Promise { + if ('resolution' in params && params.resolution !== undefined) { + console.warn( + '[pmxt] Warning: The "resolution" parameter is deprecated for fetchTrades() and will be ignored. ' + + 'It will be removed in v3.0.0. Please remove it from your code.', + ); + } + const rawTrades = await this.fetcher.fetchRawTrades(outcomeId, params); + return rawTrades.map((raw, i) => this.normalizer.normalizeTrade(raw, i)); } - return this.auth; - } - - // ---------------------------------------------------------------------------- - // Market Data (fetcher -> normalizer) - // ---------------------------------------------------------------------------- - - protected async fetchMarketsImpl( - params?: MarketFilterParams, - ): Promise { - const rawEvents = await this.fetcher.fetchRawMarkets(params); - - const allMarkets: UnifiedMarket[] = []; - for (const event of rawEvents) { - const markets = this.normalizer.normalizeMarketsFromEvent(event); - allMarkets.push(...markets); + + // ---------------------------------------------------------------------------- + // User Data (fetcher -> normalizer) + // ---------------------------------------------------------------------------- + + async fetchBalance(): Promise { + const raw = await this.fetcher.fetchRawBalance(); + return this.normalizer.normalizeBalance(raw); + } + + async fetchMyTrades(params?: MyTradesParams): Promise { + const rawFills = await this.fetcher.fetchRawMyTrades(params || {}); + return rawFills.map((raw, i) => this.normalizer.normalizeUserTrade(raw, i)); + } + + async fetchPositions(): Promise { + const rawPositions = await this.fetcher.fetchRawPositions(); + return rawPositions.map((raw) => this.normalizer.normalizePosition(raw)); + } + + async fetchClosedOrders(params?: OrderHistoryParams): Promise { + const queryParams: Record = {}; + if (params?.marketId) queryParams.ticker = params.marketId; + if (params?.until) queryParams.max_ts = Math.floor(params.until.getTime() / 1000); + if (params?.limit) queryParams.limit = params.limit; + if (params?.cursor) queryParams.cursor = params.cursor; + + const rawOrders = await this.fetcher.fetchRawHistoricalOrders(queryParams); + return rawOrders.map((o) => this.normalizer.normalizeOrder(o)); } - // Query-based search (client-side filtering) - if (params?.query) { - const lowerQuery = params.query.toLowerCase(); - const searchIn = params?.searchIn || 'title'; - const filtered = allMarkets.filter((market) => { - const titleMatch = (market.title || '').toLowerCase().includes(lowerQuery); - const descMatch = (market.description || '').toLowerCase().includes(lowerQuery); - if (searchIn === 'title') return titleMatch; - if (searchIn === 'description') return descMatch; - return titleMatch || descMatch; - }); - return filtered.slice(0, params?.limit || 250000); + async fetchAllOrders(params?: OrderHistoryParams): Promise { + const queryParams: Record = {}; + if (params?.marketId) queryParams.ticker = params.marketId; + if (params?.since) queryParams.min_ts = Math.floor(params.since.getTime() / 1000); + if (params?.until) queryParams.max_ts = Math.floor(params.until.getTime() / 1000); + if (params?.limit) queryParams.limit = params.limit; + + const historicalParams = { ...queryParams }; + delete historicalParams.min_ts; + + const [liveOrders, historicalOrders] = await Promise.all([ + this.fetcher.fetchRawOrders(queryParams), + this.fetcher.fetchRawHistoricalOrders(historicalParams), + ]); + + const seen = new Set(); + const all: Order[] = []; + for (const o of [...liveOrders, ...historicalOrders]) { + if (!seen.has(o.order_id)) { + seen.add(o.order_id); + all.push(this.normalizer.normalizeOrder(o)); + } + } + return all.sort((a, b) => b.timestamp - a.timestamp); } - // Client-side sort - if (params?.sort === 'volume') { - allMarkets.sort((a, b) => b.volume24h - a.volume24h); - } else if (params?.sort === 'liquidity') { - allMarkets.sort((a, b) => b.liquidity - a.liquidity); + // ---------------------------------------------------------------------------- + // Trading + // ---------------------------------------------------------------------------- + + async buildOrder(params: CreateOrderParams): Promise { + const isYesSide = params.side === 'buy'; + const body: Record = { + ticker: params.marketId, + client_order_id: `pmxt-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, + side: isYesSide ? 'yes' : 'no', + action: params.side === 'buy' ? 'buy' : 'sell', + count: params.amount, + type: params.type === 'limit' ? 'limit' : 'market', + }; + + if (params.price) { + const priceInCents = Math.round(params.price * 100); + if (isYesSide) { + body.yes_price = priceInCents; + } else { + body.no_price = priceInCents; + } + } + + return { exchange: this.name, params, raw: body }; } - const offset = params?.offset || 0; - const limit = params?.limit || 250000; - return allMarkets.slice(offset, offset + limit); - } - - protected async fetchEventsImpl( - params: EventFetchParams, - ): Promise { - const rawEvents = await this.fetcher.fetchRawEvents(params); - const limit = params?.limit || 250000; - const query = (params?.query || '').toLowerCase(); - - const filtered = query - ? rawEvents.filter((event) => (event.title || '').toLowerCase().includes(query)) - : rawEvents; - - const sort = params?.sort || 'volume'; - const sorted = sortRawEvents(filtered, sort); - - return sorted - .map((raw) => this.normalizer.normalizeEvent(raw)) - .filter((e): e is UnifiedEvent => e !== null) - .slice(0, limit); - } - - async fetchOHLCV( - outcomeId: string, - params: OHLCVParams, - ): Promise { - const rawCandles = await this.fetcher.fetchRawOHLCV(outcomeId, params); - return this.normalizer.normalizeOHLCV(rawCandles, params); - } - - async fetchOrderBook(outcomeId: string): Promise { - validateIdFormat(outcomeId, "OrderBook"); - const raw = await this.fetcher.fetchRawOrderBook(outcomeId); - return this.normalizer.normalizeOrderBook(raw, outcomeId); - } - - async fetchTrades( - outcomeId: string, - params: TradesParams | HistoryFilterParams, - ): Promise { - if ("resolution" in params && params.resolution !== undefined) { - console.warn( - '[pmxt] Warning: The "resolution" parameter is deprecated for fetchTrades() and will be ignored. ' + - "It will be removed in v3.0.0. Please remove it from your code.", - ); + async submitOrder(built: BuiltOrder): Promise { + const data = await this.callApi('CreateOrder', built.raw as Record); + return this.normalizer.normalizeOrder(data.order); } - const rawTrades = await this.fetcher.fetchRawTrades(outcomeId, params); - return rawTrades.map((raw, i) => this.normalizer.normalizeTrade(raw, i)); - } - - // ---------------------------------------------------------------------------- - // User Data (fetcher -> normalizer) - // ---------------------------------------------------------------------------- - - async fetchBalance(): Promise { - const raw = await this.fetcher.fetchRawBalance(); - return this.normalizer.normalizeBalance(raw); - } - - async fetchMyTrades(params?: MyTradesParams): Promise { - const rawFills = await this.fetcher.fetchRawMyTrades(params || {}); - return rawFills.map((raw, i) => this.normalizer.normalizeUserTrade(raw, i)); - } - - async fetchPositions(): Promise { - const rawPositions = await this.fetcher.fetchRawPositions(); - return rawPositions.map((raw) => this.normalizer.normalizePosition(raw)); - } - - async fetchClosedOrders(params?: OrderHistoryParams): Promise { - const queryParams: Record = {}; - if (params?.marketId) queryParams.ticker = params.marketId; - if (params?.until) queryParams.max_ts = Math.floor(params.until.getTime() / 1000); - if (params?.limit) queryParams.limit = params.limit; - if (params?.cursor) queryParams.cursor = params.cursor; - - const rawOrders = await this.fetcher.fetchRawHistoricalOrders(queryParams); - return rawOrders.map((o) => this.normalizer.normalizeOrder(o)); - } - - async fetchAllOrders(params?: OrderHistoryParams): Promise { - const queryParams: Record = {}; - if (params?.marketId) queryParams.ticker = params.marketId; - if (params?.since) queryParams.min_ts = Math.floor(params.since.getTime() / 1000); - if (params?.until) queryParams.max_ts = Math.floor(params.until.getTime() / 1000); - if (params?.limit) queryParams.limit = params.limit; - - const historicalParams = { ...queryParams }; - delete historicalParams.min_ts; - - const [liveOrders, historicalOrders] = await Promise.all([ - this.fetcher.fetchRawOrders(queryParams), - this.fetcher.fetchRawHistoricalOrders(historicalParams), - ]); - - const seen = new Set(); - const all: Order[] = []; - for (const o of [...liveOrders, ...historicalOrders]) { - if (!seen.has(o.order_id)) { - seen.add(o.order_id); - all.push(this.normalizer.normalizeOrder(o)); - } + + async createOrder(params: CreateOrderParams): Promise { + const built = await this.buildOrder(params); + return this.submitOrder(built); } - return all.sort((a, b) => b.timestamp - a.timestamp); - } - - // ---------------------------------------------------------------------------- - // Trading - // ---------------------------------------------------------------------------- - - async buildOrder(params: CreateOrderParams): Promise { - const isYesSide = params.side === "buy"; - const body: Record = { - ticker: params.marketId, - client_order_id: `pmxt-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, - side: isYesSide ? "yes" : "no", - action: params.side === "buy" ? "buy" : "sell", - count: params.amount, - type: params.type === "limit" ? "limit" : "market", - }; - - if (params.price) { - const priceInCents = Math.round(params.price * 100); - if (isYesSide) { - body.yes_price = priceInCents; - } else { - body.no_price = priceInCents; - } + + async cancelOrder(orderId: string): Promise { + const data = await this.callApi('CancelOrder', { order_id: orderId }); + const order = data.order; + return { + id: order.order_id, + marketId: order.ticker, + outcomeId: order.ticker, + side: order.side === 'yes' ? 'buy' : 'sell', + type: 'limit', + amount: order.count, + status: 'cancelled', + filled: order.count - (order.remaining_count || 0), + remaining: 0, + timestamp: new Date(order.created_time).getTime(), + }; } - return { exchange: this.name, params, raw: body }; - } - - async submitOrder(built: BuiltOrder): Promise { - const data = await this.callApi("CreateOrder", built.raw as Record); - return this.normalizer.normalizeOrder(data.order); - } - - async createOrder(params: CreateOrderParams): Promise { - const built = await this.buildOrder(params); - return this.submitOrder(built); - } - - async cancelOrder(orderId: string): Promise { - const data = await this.callApi("CancelOrder", { order_id: orderId }); - const order = data.order; - return { - id: order.order_id, - marketId: order.ticker, - outcomeId: order.ticker, - side: order.side === "yes" ? "buy" : "sell", - type: "limit", - amount: order.count, - status: "cancelled", - filled: order.count - (order.remaining_count || 0), - remaining: 0, - timestamp: new Date(order.created_time).getTime(), - }; - } - - async fetchOrder(orderId: string): Promise { - const data = await this.callApi("GetOrder", { order_id: orderId }); - return this.normalizer.normalizeOrder(data.order); - } - - async fetchOpenOrders(marketId?: string): Promise { - const queryParams: Record = { status: "resting" }; - if (marketId) queryParams.ticker = marketId; - const rawOrders = await this.fetcher.fetchRawOrders(queryParams); - return rawOrders.map((o) => this.normalizer.normalizeOrder(o)); - } - - // ---------------------------------------------------------------------------- - // WebSocket - // ---------------------------------------------------------------------------- - - private ws?: KalshiWebSocket; - - async watchOrderBook(outcomeId: string, limit?: number): Promise { - const auth = this.ensureAuth(); - if (!this.ws) { - const wsConfigWithUrl: KalshiWebSocketConfig = { - ...this.wsConfig, - wsUrl: this.wsConfig?.wsUrl || this.config.wsUrl, - }; - this.ws = new KalshiWebSocket(auth, wsConfigWithUrl); + async fetchOrder(orderId: string): Promise { + const data = await this.callApi('GetOrder', { order_id: orderId }); + return this.normalizer.normalizeOrder(data.order); } - const marketTicker = outcomeId.replace(/-NO$/, ""); - return this.ws.watchOrderBook(marketTicker); - } - - async watchOrderBooks(outcomeIds: string[], limit?: number): Promise> { - const auth = this.ensureAuth(); - if (!this.ws) { - const wsConfigWithUrl: KalshiWebSocketConfig = { - ...this.wsConfig, - wsUrl: this.wsConfig?.wsUrl || this.config.wsUrl, - }; - this.ws = new KalshiWebSocket(auth, wsConfigWithUrl); + + async fetchOpenOrders(marketId?: string): Promise { + const queryParams: Record = { status: 'resting' }; + if (marketId) queryParams.ticker = marketId; + const rawOrders = await this.fetcher.fetchRawOrders(queryParams); + return rawOrders.map((o) => this.normalizer.normalizeOrder(o)); } - const marketTickers = outcomeIds.map((oid) => oid.replace(/-NO$/, "")); - return this.ws.watchOrderBooks(marketTickers); - } - - async watchTrades( - outcomeId: string, - address?: string, - since?: number, - limit?: number, - ): Promise { - const auth = this.ensureAuth(); - if (!this.ws) { - const wsConfigWithUrl: KalshiWebSocketConfig = { - ...this.wsConfig, - wsUrl: this.wsConfig?.wsUrl || this.config.wsUrl, - }; - this.ws = new KalshiWebSocket(auth, wsConfigWithUrl); + + // ---------------------------------------------------------------------------- + // WebSocket + // ---------------------------------------------------------------------------- + + private ws?: KalshiWebSocket; + + async watchOrderBook(outcomeId: string, limit?: number): Promise { + const auth = this.ensureAuth(); + if (!this.ws) { + const wsConfigWithUrl: KalshiWebSocketConfig = { + ...this.wsConfig, + wsUrl: this.wsConfig?.wsUrl || this.config.wsUrl, + }; + this.ws = new KalshiWebSocket(auth, wsConfigWithUrl); + } + const marketTicker = outcomeId.replace(/-NO$/, ''); + return this.ws.watchOrderBook(marketTicker); } - const marketTicker = outcomeId.replace(/-NO$/, ""); - return this.ws.watchTrades(marketTicker); - } - - async close(): Promise { - if (this.ws) { - await this.ws.close(); - this.ws = undefined; + + async watchOrderBooks(outcomeIds: string[], limit?: number): Promise> { + const auth = this.ensureAuth(); + if (!this.ws) { + const wsConfigWithUrl: KalshiWebSocketConfig = { + ...this.wsConfig, + wsUrl: this.wsConfig?.wsUrl || this.config.wsUrl, + }; + this.ws = new KalshiWebSocket(auth, wsConfigWithUrl); + } + const marketTickers = outcomeIds.map((oid) => oid.replace(/-NO$/, '')); + return this.ws.watchOrderBooks(marketTickers); + } + + async watchTrades( + outcomeId: string, + address?: string, + since?: number, + limit?: number, + ): Promise { + const auth = this.ensureAuth(); + if (!this.ws) { + const wsConfigWithUrl: KalshiWebSocketConfig = { + ...this.wsConfig, + wsUrl: this.wsConfig?.wsUrl || this.config.wsUrl, + }; + this.ws = new KalshiWebSocket(auth, wsConfigWithUrl); + } + const marketTicker = outcomeId.replace(/-NO$/, ''); + return this.ws.watchTrades(marketTicker); + } + + async close(): Promise { + if (this.ws) { + await this.ws.close(); + this.ws = undefined; + } } - } } diff --git a/core/src/exchanges/polymarket/api-clob.ts b/core/src/exchanges/polymarket/api-clob.ts index 09b58b0f..924c5628 100644 --- a/core/src/exchanges/polymarket/api-clob.ts +++ b/core/src/exchanges/polymarket/api-clob.ts @@ -1,6 +1,6 @@ /** - * Auto-generated from /Users/ndmeiri/Developer/pmxt/core/specs/polymarket/PolymarketClobAPI.yaml - * Generated at: 2026-04-21T22:01:26.553Z + * Auto-generated from /home/zihao/pmxt/core/specs/polymarket/PolymarketClobAPI.yaml + * Generated at: 2026-05-10T23:00:51.405Z * Do not edit manually -- run "npm run fetch:openapi" to regenerate. */ export const polymarketClobSpec = { diff --git a/core/src/exchanges/polymarket/api-data.ts b/core/src/exchanges/polymarket/api-data.ts index f0ffbd57..8e3e42e5 100644 --- a/core/src/exchanges/polymarket/api-data.ts +++ b/core/src/exchanges/polymarket/api-data.ts @@ -1,6 +1,6 @@ /** - * Auto-generated from /Users/ndmeiri/Developer/pmxt/core/specs/polymarket/Polymarket_Data_API.yaml - * Generated at: 2026-04-21T22:01:26.557Z + * Auto-generated from /home/zihao/pmxt/core/specs/polymarket/Polymarket_Data_API.yaml + * Generated at: 2026-05-10T23:00:51.410Z * Do not edit manually -- run "npm run fetch:openapi" to regenerate. */ export const polymarketDataSpec = { diff --git a/core/src/exchanges/polymarket/api-gamma.ts b/core/src/exchanges/polymarket/api-gamma.ts index 83a63934..7d218640 100644 --- a/core/src/exchanges/polymarket/api-gamma.ts +++ b/core/src/exchanges/polymarket/api-gamma.ts @@ -1,6 +1,6 @@ /** - * Auto-generated from /Users/ndmeiri/Developer/pmxt/core/specs/polymarket/PolymarketGammaAPI.yaml - * Generated at: 2026-04-21T22:01:26.556Z + * Auto-generated from /home/zihao/pmxt/core/specs/polymarket/PolymarketGammaAPI.yaml + * Generated at: 2026-05-10T23:00:51.408Z * Do not edit manually -- run "npm run fetch:openapi" to regenerate. */ export const polymarketGammaSpec = { diff --git a/core/src/exchanges/polymarket/fetcher.ts b/core/src/exchanges/polymarket/fetcher.ts index a1329871..135eb2df 100644 --- a/core/src/exchanges/polymarket/fetcher.ts +++ b/core/src/exchanges/polymarket/fetcher.ts @@ -79,6 +79,7 @@ export interface PolymarketRawOrderBookLevel { } export interface PolymarketRawOrderBook { + asset_id: string; bids?: PolymarketRawOrderBookLevel[]; asks?: PolymarketRawOrderBookLevel[]; timestamp?: string | number; @@ -233,6 +234,32 @@ export class PolymarketFetcher implements IExchangeFetcher { + try { + const payload = ids.map(id => ({token_id: id})); + const books: PolymarketRawOrderBook[] = await this.ctx.callApi('postBooks', payload); + if (books.length !== ids.length) { + const returned = new Set(books.map(b => b.asset_id)); + const missing = ids.filter(id => !returned.has(id)); + throw new NotFound(`Order book not found for token IDs ${missing.join(', ')}`, 'Polymarket'); + } + return books; + } catch (error: any) { + if (error instanceof NotFound) throw error; + const mapped = polymarketErrorMapper.mapError(error); + if (mapped instanceof OrderNotFound) { + throw new NotFound( + `${mapped.message}. ` + + `fetchRawOrderBooks requires a list of outcome token IDs` + + `(market.yes.outcomeId or market.no.outcomeId from fetchMarkets), ` + + `not a market slug or condition ID.`, + 'Polymarket', + ); + } + throw mapped; + } + } + // ------------------------------------------------------------------------ // Trades // ------------------------------------------------------------------------ diff --git a/core/src/exchanges/polymarket/index.ts b/core/src/exchanges/polymarket/index.ts index 690e4fce..e95441f9 100644 --- a/core/src/exchanges/polymarket/index.ts +++ b/core/src/exchanges/polymarket/index.ts @@ -1,5 +1,5 @@ -import { AssetType, Side } from '@polymarket/clob-client-v2'; import type { SignedOrder } from '@polymarket/clob-client-v2'; +import { AssetType, Side } from '@polymarket/clob-client-v2'; import { createHmac } from 'crypto'; import { EventFetchParams, @@ -166,6 +166,21 @@ export class PolymarketExchange extends PredictionMarketExchange { return this.normalizer.normalizeOrderBook(raw, outcomeId); } + async fetchOrderBooks(outcomeIds: string[]): Promise> { + outcomeIds.forEach((outcomeId) => { + validateIdFormat(outcomeId, 'OrderBook'); + validateOutcomeId(outcomeId, 'OrderBook'); + }); + const raw = await this.fetcher.fetchRawOrderBooks(outcomeIds); + const byAssetId = new Map(raw.map(item => [item.asset_id, item])); + const response: Record = {}; + outcomeIds.forEach((outcomeId) => { + const item = byAssetId.get(outcomeId); + if (item) response[outcomeId] = this.normalizer.normalizeOrderBook(item, outcomeId); + }); + return response; + } + async fetchTrades(outcomeId: string, params: TradesParams | HistoryFilterParams): Promise { validateIdFormat(outcomeId, 'Trades'); validateOutcomeId(outcomeId, 'Trades'); diff --git a/core/src/server/method-verbs.json b/core/src/server/method-verbs.json index def1529f..5d0b7e19 100644 --- a/core/src/server/method-verbs.json +++ b/core/src/server/method-verbs.json @@ -99,6 +99,16 @@ } ] }, + "fetchOrderBooks": { + "verb": "post", + "args": [ + { + "name": "outcomeIds", + "kind": "unknown", + "optional": false + } + ] + }, "fetchTrades": { "verb": "get", "args": [ diff --git a/core/src/server/openapi.yaml b/core/src/server/openapi.yaml index a067ad43..bb73fe19 100644 --- a/core/src/server/openapi.yaml +++ b/core/src/server/openapi.yaml @@ -72,7 +72,25 @@ paths: summary: Fetch Markets operationId: fetchMarkets parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - probable + - baozi + - myriad + - opinion + - metaculus + - smarkets + - polymarket_us + - router + required: true + description: The prediction market exchange to target. - in: query name: limit required: false @@ -258,7 +276,25 @@ paths: summary: Fetch Events operationId: fetchEvents parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - probable + - baozi + - myriad + - opinion + - metaculus + - smarkets + - polymarket_us + - router + required: true + description: The prediction market exchange to target. - in: query name: query required: false @@ -582,7 +618,21 @@ paths: summary: Fetch OHLCV operationId: fetchOHLCV parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - probable + - baozi + - myriad + - opinion + required: true + description: The prediction market exchange to target. - in: query name: outcomeId required: true @@ -634,7 +684,24 @@ paths: summary: Fetch Order Book operationId: fetchOrderBook parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - probable + - baozi + - myriad + - opinion + - smarkets + - polymarket_us + - router + required: true + description: The prediction market exchange to target. - in: query name: outcomeId required: true @@ -660,12 +727,77 @@ paths: description: >- Fetch the current order book (bids/asks) for a specific outcome. Essential for calculating spread, depth, and execution prices. + '/api/{exchange}/fetchOrderBooks': + post: + summary: Fetch Order Books + operationId: fetchOrderBooks + parameters: + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + required: true + description: The prediction market exchange to target. + requestBody: + content: + application/json: + schema: + title: FetchOrderBooksRequest + type: object + properties: + args: + type: array + maxItems: 1 + items: + type: array + items: + type: string + minItems: 1 + credentials: + $ref: '#/components/schemas/ExchangeCredentials' + required: + - args + responses: + '200': + description: Fetch Order Books response + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/BaseResponse' + - type: object + properties: + data: + type: object + additionalProperties: + $ref: '#/components/schemas/OrderBook' + description: >- + Batch variant of {@link fetchOrderBook}. Fetches order books for multiple outcomes in a single request where the + exchange supports it. '/api/{exchange}/fetchTrades': get: summary: Fetch Trades operationId: fetchTrades parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - probable + - baozi + - myriad + - smarkets + required: true + description: The prediction market exchange to target. - in: query name: outcomeId required: true @@ -711,7 +843,24 @@ paths: summary: Create Order operationId: createOrder parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - probable + - baozi + - myriad + - opinion + - metaculus + - smarkets + - polymarket_us + required: true + description: The prediction market exchange to target. requestBody: content: application/json: @@ -747,7 +896,19 @@ paths: summary: Build Order operationId: buildOrder parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - opinion + - smarkets + - polymarket_us + required: true + description: The prediction market exchange to target. requestBody: content: application/json: @@ -785,7 +946,19 @@ paths: summary: Submit Order operationId: submitOrder parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - opinion + - smarkets + - polymarket_us + required: true + description: The prediction market exchange to target. requestBody: content: application/json: @@ -821,7 +994,22 @@ paths: summary: Cancel Order operationId: cancelOrder parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - probable + - opinion + - metaculus + - smarkets + - polymarket_us + required: true + description: The prediction market exchange to target. requestBody: content: application/json: @@ -857,7 +1045,21 @@ paths: summary: Fetch Order operationId: fetchOrder parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - probable + - baozi + - opinion + - smarkets + - polymarket_us + required: true + description: The prediction market exchange to target. - in: query name: orderId required: true @@ -881,7 +1083,23 @@ paths: summary: Fetch Open Orders operationId: fetchOpenOrders parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - probable + - baozi + - myriad + - opinion + - smarkets + - polymarket_us + required: true + description: The prediction market exchange to target. - in: query name: marketId required: false @@ -907,7 +1125,22 @@ paths: summary: Fetch My Trades operationId: fetchMyTrades parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - probable + - myriad + - opinion + - smarkets + - polymarket_us + required: true + description: The prediction market exchange to target. - in: query name: outcomeId required: false @@ -965,7 +1198,18 @@ paths: summary: Fetch Closed Orders operationId: fetchClosedOrders parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - kalshi + - kalshi-demo + - limitless + - opinion + - smarkets + required: true + description: The prediction market exchange to target. - in: query name: marketId required: false @@ -1017,7 +1261,18 @@ paths: summary: Fetch All Orders operationId: fetchAllOrders parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - kalshi + - kalshi-demo + - limitless + - opinion + - smarkets + required: true + description: The prediction market exchange to target. - in: query name: marketId required: false @@ -1069,7 +1324,23 @@ paths: summary: Fetch Positions operationId: fetchPositions parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - probable + - baozi + - myriad + - opinion + - smarkets + - polymarket_us + required: true + description: The prediction market exchange to target. - in: query name: address required: false @@ -1095,7 +1366,22 @@ paths: summary: Fetch Balance operationId: fetchBalance parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - probable + - baozi + - myriad + - smarkets + - polymarket_us + required: true + description: The prediction market exchange to target. - in: query name: address required: false @@ -1299,7 +1585,22 @@ paths: summary: Watch Order Book operationId: watchOrderBook parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - probable + - baozi + - myriad + - opinion + - polymarket_us + required: true + description: The prediction market exchange to target. requestBody: content: application/json: @@ -1339,7 +1640,22 @@ paths: summary: Watch Order Books operationId: watchOrderBooks parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - probable + - baozi + - myriad + - opinion + - polymarket_us + required: true + description: The prediction market exchange to target. requestBody: content: application/json: @@ -1384,7 +1700,14 @@ paths: summary: Unwatch Order Book operationId: unwatchOrderBook parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + required: true + description: The prediction market exchange to target. requestBody: content: application/json: @@ -1415,7 +1738,20 @@ paths: summary: Watch Trades operationId: watchTrades parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - kalshi + - kalshi-demo + - limitless + - myriad + - opinion + - polymarket_us + required: true + description: The prediction market exchange to target. requestBody: content: application/json: @@ -1459,7 +1795,15 @@ paths: summary: Watch Address operationId: watchAddress parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - limitless + required: true + description: The prediction market exchange to target. requestBody: content: application/json: @@ -1501,7 +1845,15 @@ paths: summary: Unwatch Address operationId: unwatchAddress parameters: - - $ref: '#/components/parameters/ExchangeParam' + - in: path + name: exchange + schema: + type: string + enum: + - polymarket + - limitless + required: true + description: The prediction market exchange to target. requestBody: content: application/json: diff --git a/docs/api-reference/openapi.json b/docs/api-reference/openapi.json index e2b981bc..843a1190 100644 --- a/docs/api-reference/openapi.json +++ b/docs/api-reference/openapi.json @@ -3,7 +3,7 @@ "info": { "title": "PMXT Hosted API", "description": "One API for every prediction market. Cross-venue search in under 10ms, a single unified schema, and the complete venue surface from reads to trades.", - "version": "2.40.5" + "version": "2.17.1" }, "servers": [ { @@ -264,7 +264,27 @@ "operationId": "fetchMarkets", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "probable", + "baozi", + "myriad", + "opinion", + "metaculus", + "smarkets", + "polymarket_us", + "router" + ] + }, + "required": true, + "description": "The prediction market exchange to target." }, { "in": "query", @@ -479,21 +499,6 @@ "label": "PolymarketUs", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_markets(\n limit=10,\n offset=0,\n sort=\"volume\",\n status=\"active\",\n search_in=\"title\",\n query=\"election\",\n slug=\"BTC-USD\",\n market_id=\"12345\",\n outcome_id=\"67890\",\n event_id=\"12345\",\n page=1,\n similarity_threshold=1,\n)" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_markets(\n limit=10,\n offset=0,\n sort=\"volume\",\n status=\"active\",\n search_in=\"title\",\n query=\"election\",\n slug=\"BTC-USD\",\n market_id=\"12345\",\n outcome_id=\"67890\",\n event_id=\"12345\",\n page=1,\n similarity_threshold=1,\n)" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_markets(\n limit=10,\n offset=0,\n sort=\"volume\",\n status=\"active\",\n search_in=\"title\",\n query=\"election\",\n slug=\"BTC-USD\",\n market_id=\"12345\",\n outcome_id=\"67890\",\n event_id=\"12345\",\n page=1,\n similarity_threshold=1,\n)" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_markets(\n limit=10,\n offset=0,\n sort=\"volume\",\n status=\"active\",\n search_in=\"title\",\n query=\"election\",\n slug=\"BTC-USD\",\n market_id=\"12345\",\n outcome_id=\"67890\",\n event_id=\"12345\",\n page=1,\n similarity_threshold=1,\n)" - }, { "lang": "python", "label": "Router", @@ -554,21 +559,6 @@ "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchMarkets({\n limit: 10,\n offset: 0,\n sort: \"volume\",\n status: \"active\",\n searchIn: \"title\",\n query: \"election\",\n slug: \"BTC-USD\",\n marketId: \"12345\",\n outcomeId: \"67890\",\n eventId: \"12345\",\n page: 1,\n similarityThreshold: 1,\n});" }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchMarkets({\n limit: 10,\n offset: 0,\n sort: \"volume\",\n status: \"active\",\n searchIn: \"title\",\n query: \"election\",\n slug: \"BTC-USD\",\n marketId: \"12345\",\n outcomeId: \"67890\",\n eventId: \"12345\",\n page: 1,\n similarityThreshold: 1,\n});" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchMarkets({\n limit: 10,\n offset: 0,\n sort: \"volume\",\n status: \"active\",\n searchIn: \"title\",\n query: \"election\",\n slug: \"BTC-USD\",\n marketId: \"12345\",\n outcomeId: \"67890\",\n eventId: \"12345\",\n page: 1,\n similarityThreshold: 1,\n});" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchMarkets({\n limit: 10,\n offset: 0,\n sort: \"volume\",\n status: \"active\",\n searchIn: \"title\",\n query: \"election\",\n slug: \"BTC-USD\",\n marketId: \"12345\",\n outcomeId: \"67890\",\n eventId: \"12345\",\n page: 1,\n similarityThreshold: 1,\n});" - }, { "lang": "javascript", "label": "Router", @@ -1015,7 +1005,27 @@ "operationId": "fetchEvents", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "probable", + "baozi", + "myriad", + "opinion", + "metaculus", + "smarkets", + "polymarket_us", + "router" + ] + }, + "required": true, + "description": "The prediction market exchange to target." }, { "in": "query", @@ -1228,21 +1238,6 @@ "label": "PolymarketUs", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_events(\n query=\"election\",\n limit=10,\n offset=0,\n sort=\"volume\",\n status=\"active\",\n search_in=\"title\",\n event_id=\"12345\",\n slug=\"BTC-USD\",\n filter=\"value\",\n category=\"value\",\n tags=[],\n)" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_events(\n query=\"election\",\n limit=10,\n offset=0,\n sort=\"volume\",\n status=\"active\",\n search_in=\"title\",\n event_id=\"12345\",\n slug=\"BTC-USD\",\n filter=\"value\",\n category=\"value\",\n tags=[],\n)" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_events(\n query=\"election\",\n limit=10,\n offset=0,\n sort=\"volume\",\n status=\"active\",\n search_in=\"title\",\n event_id=\"12345\",\n slug=\"BTC-USD\",\n filter=\"value\",\n category=\"value\",\n tags=[],\n)" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_events(\n query=\"election\",\n limit=10,\n offset=0,\n sort=\"volume\",\n status=\"active\",\n search_in=\"title\",\n event_id=\"12345\",\n slug=\"BTC-USD\",\n filter=\"value\",\n category=\"value\",\n tags=[],\n)" - }, { "lang": "python", "label": "Router", @@ -1303,21 +1298,6 @@ "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchEvents({\n query: \"election\",\n limit: 10,\n offset: 0,\n sort: \"volume\",\n status: \"active\",\n searchIn: \"title\",\n eventId: \"12345\",\n slug: \"BTC-USD\",\n filter: \"value\",\n category: \"value\",\n tags: [],\n});" }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchEvents({\n query: \"election\",\n limit: 10,\n offset: 0,\n sort: \"volume\",\n status: \"active\",\n searchIn: \"title\",\n eventId: \"12345\",\n slug: \"BTC-USD\",\n filter: \"value\",\n category: \"value\",\n tags: [],\n});" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchEvents({\n query: \"election\",\n limit: 10,\n offset: 0,\n sort: \"volume\",\n status: \"active\",\n searchIn: \"title\",\n eventId: \"12345\",\n slug: \"BTC-USD\",\n filter: \"value\",\n category: \"value\",\n tags: [],\n});" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchEvents({\n query: \"election\",\n limit: 10,\n offset: 0,\n sort: \"volume\",\n status: \"active\",\n searchIn: \"title\",\n eventId: \"12345\",\n slug: \"BTC-USD\",\n filter: \"value\",\n category: \"value\",\n tags: [],\n});" - }, { "lang": "javascript", "label": "Router", @@ -1962,7 +1942,23 @@ "operationId": "fetchOHLCV", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "probable", + "baozi", + "myriad", + "opinion" + ] + }, + "required": true, + "description": "The prediction market exchange to target." }, { "in": "query", @@ -2081,41 +2077,6 @@ "label": "Opinion", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_ohlcv(\n outcome_id=\"67890\",\n resolution=\"1h\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_ohlcv(\n outcome_id=\"67890\",\n resolution=\"1h\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, - { - "lang": "python", - "label": "Smarkets", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Smarkets(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_ohlcv(\n outcome_id=\"67890\",\n resolution=\"1h\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, - { - "lang": "python", - "label": "PolymarketUs", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_ohlcv(\n outcome_id=\"67890\",\n resolution=\"1h\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_ohlcv(\n outcome_id=\"67890\",\n resolution=\"1h\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_ohlcv(\n outcome_id=\"67890\",\n resolution=\"1h\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_ohlcv(\n outcome_id=\"67890\",\n resolution=\"1h\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_ohlcv(\n outcome_id=\"67890\",\n resolution=\"1h\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, { "lang": "javascript", "label": "Polymarket", @@ -2155,41 +2116,6 @@ "lang": "javascript", "label": "Opinion", "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOHLCV({\n outcomeId: \"67890\",\n resolution: \"1h\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOHLCV({\n outcomeId: \"67890\",\n resolution: \"1h\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, - { - "lang": "javascript", - "label": "Smarkets", - "source": "import { Smarkets } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Smarkets({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOHLCV({\n outcomeId: \"67890\",\n resolution: \"1h\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, - { - "lang": "javascript", - "label": "PolymarketUs", - "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOHLCV({\n outcomeId: \"67890\",\n resolution: \"1h\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOHLCV({\n outcomeId: \"67890\",\n resolution: \"1h\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOHLCV({\n outcomeId: \"67890\",\n resolution: \"1h\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOHLCV({\n outcomeId: \"67890\",\n resolution: \"1h\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOHLCV({\n outcomeId: \"67890\",\n resolution: \"1h\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" } ] } @@ -2200,7 +2126,26 @@ "operationId": "fetchOrderBook", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "probable", + "baozi", + "myriad", + "opinion", + "smarkets", + "polymarket_us", + "router" + ] + }, + "required": true, + "description": "The prediction market exchange to target." }, { "in": "query", @@ -2286,11 +2231,6 @@ "label": "Opinion", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order_book(outcome_id=\"67890\", side=\"buy\")" }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order_book(outcome_id=\"67890\", side=\"buy\")" - }, { "lang": "python", "label": "Smarkets", @@ -2301,21 +2241,6 @@ "label": "PolymarketUs", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order_book(outcome_id=\"67890\", side=\"buy\")" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order_book(outcome_id=\"67890\", side=\"buy\")" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order_book(outcome_id=\"67890\", side=\"buy\")" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order_book(outcome_id=\"67890\", side=\"buy\")" - }, { "lang": "python", "label": "Router", @@ -2361,11 +2286,6 @@ "label": "Opinion", "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrderBook({ outcomeId: \"67890\", side: \"buy\" });" }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrderBook({ outcomeId: \"67890\", side: \"buy\" });" - }, { "lang": "javascript", "label": "Smarkets", @@ -2378,23 +2298,120 @@ }, { "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrderBook({ outcomeId: \"67890\", side: \"buy\" });" + "label": "Router", + "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrderBook({ outcomeId: \"67890\", side: \"buy\" });" + } + ] + } + }, + "/api/{exchange}/fetchOrderBooks": { + "post": { + "summary": "Fetch Order Books", + "operationId": "fetchOrderBooks", + "parameters": [ + { + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo" + ] + }, + "required": true, + "description": "The prediction market exchange to target." + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "title": "FetchOrderBooksRequest", + "type": "object", + "properties": { + "args": { + "type": "array", + "maxItems": 1, + "items": { + "type": "array", + "items": { + "type": "string" + } + }, + "minItems": 1 + }, + "credentials": { + "$ref": "#/components/schemas/ExchangeCredentials" + } + }, + "required": [ + "args" + ] + } + } + } + }, + "responses": { + "200": { + "description": "Fetch Order Books response", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/BaseResponse" + }, + { + "type": "object", + "properties": { + "data": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/OrderBook" + } + } + } + } + ] + } + } + } + } + }, + "description": "Batch variant of {@link fetchOrderBook}. Fetches order books for multiple outcomes in a single request where the exchange supports it.", + "security": [], + "x-codeSamples": [ + { + "lang": "python", + "label": "Polymarket", + "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Polymarket(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order_books()" + }, + { + "lang": "python", + "label": "Kalshi", + "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Kalshi(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order_books()" + }, + { + "lang": "python", + "label": "KalshiDemo", + "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.KalshiDemo(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order_books()" }, { "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrderBook({ outcomeId: \"67890\", side: \"buy\" });" + "label": "Polymarket", + "source": "import { Polymarket } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Polymarket({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrderBooks();" }, { "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrderBook({ outcomeId: \"67890\", side: \"buy\" });" + "label": "Kalshi", + "source": "import { Kalshi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Kalshi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrderBooks();" }, { "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrderBook({ outcomeId: \"67890\", side: \"buy\" });" + "label": "KalshiDemo", + "source": "import { KalshiDemo } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new KalshiDemo({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrderBooks();" } ] } @@ -2405,7 +2422,23 @@ "operationId": "fetchTrades", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "probable", + "baozi", + "myriad", + "smarkets" + ] + }, + "required": true, + "description": "The prediction market exchange to target." }, { "in": "query", @@ -2510,46 +2543,11 @@ "label": "Myriad", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Myriad(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_trades(\n outcome_id=\"67890\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" }, - { - "lang": "python", - "label": "Opinion", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_trades(\n outcome_id=\"67890\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_trades(\n outcome_id=\"67890\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, { "lang": "python", "label": "Smarkets", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Smarkets(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_trades(\n outcome_id=\"67890\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" }, - { - "lang": "python", - "label": "PolymarketUs", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_trades(\n outcome_id=\"67890\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_trades(\n outcome_id=\"67890\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_trades(\n outcome_id=\"67890\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_trades(\n outcome_id=\"67890\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_trades(\n outcome_id=\"67890\",\n start=\"value\",\n end=\"value\",\n limit=10,\n)" - }, { "lang": "javascript", "label": "Polymarket", @@ -2585,45 +2583,10 @@ "label": "Myriad", "source": "import { Myriad } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Myriad({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchTrades({\n outcomeId: \"67890\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" }, - { - "lang": "javascript", - "label": "Opinion", - "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchTrades({\n outcomeId: \"67890\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchTrades({\n outcomeId: \"67890\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, { "lang": "javascript", "label": "Smarkets", "source": "import { Smarkets } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Smarkets({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchTrades({\n outcomeId: \"67890\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, - { - "lang": "javascript", - "label": "PolymarketUs", - "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchTrades({\n outcomeId: \"67890\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchTrades({\n outcomeId: \"67890\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchTrades({\n outcomeId: \"67890\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchTrades({\n outcomeId: \"67890\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchTrades({\n outcomeId: \"67890\",\n start: \"value\",\n end: \"value\",\n limit: 10,\n});" } ] } @@ -2634,7 +2597,26 @@ "operationId": "createOrder", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "probable", + "baozi", + "myriad", + "opinion", + "metaculus", + "smarkets", + "polymarket_us" + ] + }, + "required": true, + "description": "The prediction market exchange to target." } ], "requestBody": { @@ -2752,26 +2734,6 @@ "label": "PolymarketUs", "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.PolymarketUs(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nresult = exchange.create_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Hyperliquid(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nresult = exchange.create_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.GeminiTitan(\n api_key=\"YOUR_API_KEY\",\n api_secret=\"YOUR_API_SECRET\",\n)\nresult = exchange.create_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Mock()\nresult = exchange.create_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Router()\nresult = exchange.create_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" - }, { "lang": "javascript", "label": "Polymarket", @@ -2826,26 +2788,6 @@ "lang": "javascript", "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new PolymarketUs({\n apiKey: \"YOUR_API_KEY\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst result = await exchange.createOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Hyperliquid({\n apiKey: \"YOUR_API_KEY\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst result = await exchange.createOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new GeminiTitan({\n apiKey: \"YOUR_API_KEY\",\n apiSecret: \"YOUR_API_SECRET\",\n});\nconst result = await exchange.createOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Mock();\nconst result = await exchange.createOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Router();\nconst result = await exchange.createOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" } ] } @@ -2856,7 +2798,21 @@ "operationId": "buildOrder", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "opinion", + "smarkets", + "polymarket_us" + ] + }, + "required": true, + "description": "The prediction market exchange to target." } ], "requestBody": { @@ -2924,11 +2880,6 @@ "label": "Polymarket", "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Polymarket(\n api_key=\"YOUR_API_KEY\",\n api_secret=\"YOUR_API_SECRET\",\n passphrase=\"YOUR_PASSPHRASE\",\n private_key=\"YOUR_PRIVATE_KEY\",\n proxy_address=\"YOUR_PROXY_ADDRESS\",\n signature_type=\"gnosis-safe\",\n)\nresult = exchange.build_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" }, - { - "lang": "python", - "label": "Limitless", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Limitless(\n api_key=\"YOUR_API_KEY\",\n api_secret=\"YOUR_API_SECRET\",\n passphrase=\"YOUR_PASSPHRASE\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nresult = exchange.build_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" - }, { "lang": "python", "label": "Kalshi", @@ -2939,31 +2890,11 @@ "label": "KalshiDemo", "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.KalshiDemo(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nresult = exchange.build_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" }, - { - "lang": "python", - "label": "Probable", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Probable(\n api_key=\"YOUR_API_KEY\",\n api_secret=\"YOUR_API_SECRET\",\n passphrase=\"YOUR_PASSPHRASE\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nresult = exchange.build_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" - }, - { - "lang": "python", - "label": "Baozi", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Baozi(\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nresult = exchange.build_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" - }, - { - "lang": "python", - "label": "Myriad", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Myriad(\n api_key=\"YOUR_API_KEY\",\n wallet_address=\"YOUR_WALLET_ADDRESS\",\n)\nresult = exchange.build_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" - }, { "lang": "python", "label": "Opinion", "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Opinion(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n proxy_address=\"YOUR_PROXY_ADDRESS\",\n)\nresult = exchange.build_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Metaculus(\n api_token=\"YOUR_API_TOKEN\",\n)\nresult = exchange.build_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" - }, { "lang": "python", "label": "Smarkets", @@ -2974,36 +2905,11 @@ "label": "PolymarketUs", "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.PolymarketUs(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nresult = exchange.build_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Hyperliquid(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nresult = exchange.build_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.GeminiTitan(\n api_key=\"YOUR_API_KEY\",\n api_secret=\"YOUR_API_SECRET\",\n)\nresult = exchange.build_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Mock()\nresult = exchange.build_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Router()\nresult = exchange.build_order(\n market_id=\"12345\",\n outcome_id=\"67890\",\n side=\"buy\",\n type=\"limit\",\n amount=10,\n price=0.55,\n fee=1,\n tick_size=1,\n neg_risk=True,\n on_behalf_of=1,\n)" - }, { "lang": "javascript", "label": "Polymarket", "source": "import { Polymarket } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Polymarket({\n apiKey: \"YOUR_API_KEY\",\n apiSecret: \"YOUR_API_SECRET\",\n passphrase: \"YOUR_PASSPHRASE\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n proxyAddress: \"YOUR_PROXY_ADDRESS\",\n signatureType: \"gnosis-safe\",\n});\nconst result = await exchange.buildOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" }, - { - "lang": "javascript", - "label": "Limitless", - "source": "import { Limitless } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Limitless({\n apiKey: \"YOUR_API_KEY\",\n apiSecret: \"YOUR_API_SECRET\",\n passphrase: \"YOUR_PASSPHRASE\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst result = await exchange.buildOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" - }, { "lang": "javascript", "label": "Kalshi", @@ -3014,31 +2920,11 @@ "label": "KalshiDemo", "source": "import { KalshiDemo } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new KalshiDemo({\n apiKey: \"YOUR_API_KEY\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst result = await exchange.buildOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" }, - { - "lang": "javascript", - "label": "Probable", - "source": "import { Probable } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Probable({\n apiKey: \"YOUR_API_KEY\",\n apiSecret: \"YOUR_API_SECRET\",\n passphrase: \"YOUR_PASSPHRASE\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst result = await exchange.buildOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" - }, - { - "lang": "javascript", - "label": "Baozi", - "source": "import { Baozi } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Baozi({\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst result = await exchange.buildOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" - }, - { - "lang": "javascript", - "label": "Myriad", - "source": "import { Myriad } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Myriad({\n apiKey: \"YOUR_API_KEY\",\n walletAddress: \"YOUR_WALLET_ADDRESS\",\n});\nconst result = await exchange.buildOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" - }, { "lang": "javascript", "label": "Opinion", "source": "import { Opinion } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Opinion({\n apiKey: \"YOUR_API_KEY\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n proxyAddress: \"YOUR_PROXY_ADDRESS\",\n});\nconst result = await exchange.buildOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Metaculus({\n apiToken: \"YOUR_API_TOKEN\",\n});\nconst result = await exchange.buildOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" - }, { "lang": "javascript", "label": "Smarkets", @@ -3048,26 +2934,6 @@ "lang": "javascript", "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new PolymarketUs({\n apiKey: \"YOUR_API_KEY\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst result = await exchange.buildOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Hyperliquid({\n apiKey: \"YOUR_API_KEY\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst result = await exchange.buildOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new GeminiTitan({\n apiKey: \"YOUR_API_KEY\",\n apiSecret: \"YOUR_API_SECRET\",\n});\nconst result = await exchange.buildOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Mock();\nconst result = await exchange.buildOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Router();\nconst result = await exchange.buildOrder({\n marketId: \"12345\",\n outcomeId: \"67890\",\n side: \"buy\",\n type: \"limit\",\n amount: 10,\n price: 0.55,\n fee: 1,\n tickSize: 1,\n negRisk: true,\n onBehalfOf: 1,\n});" } ] } @@ -3078,7 +2944,21 @@ "operationId": "submitOrder", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "opinion", + "smarkets", + "polymarket_us" + ] + }, + "required": true, + "description": "The prediction market exchange to target." } ], "requestBody": { @@ -3146,11 +3026,6 @@ "label": "Polymarket", "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Polymarket(\n api_key=\"YOUR_API_KEY\",\n api_secret=\"YOUR_API_SECRET\",\n passphrase=\"YOUR_PASSPHRASE\",\n private_key=\"YOUR_PRIVATE_KEY\",\n proxy_address=\"YOUR_PROXY_ADDRESS\",\n signature_type=\"gnosis-safe\",\n)\nbuilt = exchange.build_order(market_id=\"12345\", side=\"buy\", type=\"limit\", amount=10, price=0.55)\nresult = exchange.submit_order(built)" }, - { - "lang": "python", - "label": "Limitless", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Limitless(\n api_key=\"YOUR_API_KEY\",\n api_secret=\"YOUR_API_SECRET\",\n passphrase=\"YOUR_PASSPHRASE\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nbuilt = exchange.build_order(market_id=\"12345\", side=\"buy\", type=\"limit\", amount=10, price=0.55)\nresult = exchange.submit_order(built)" - }, { "lang": "python", "label": "Kalshi", @@ -3161,31 +3036,11 @@ "label": "KalshiDemo", "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.KalshiDemo(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nbuilt = exchange.build_order(market_id=\"12345\", side=\"buy\", type=\"limit\", amount=10, price=0.55)\nresult = exchange.submit_order(built)" }, - { - "lang": "python", - "label": "Probable", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Probable(\n api_key=\"YOUR_API_KEY\",\n api_secret=\"YOUR_API_SECRET\",\n passphrase=\"YOUR_PASSPHRASE\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nbuilt = exchange.build_order(market_id=\"12345\", side=\"buy\", type=\"limit\", amount=10, price=0.55)\nresult = exchange.submit_order(built)" - }, - { - "lang": "python", - "label": "Baozi", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Baozi(\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nbuilt = exchange.build_order(market_id=\"12345\", side=\"buy\", type=\"limit\", amount=10, price=0.55)\nresult = exchange.submit_order(built)" - }, - { - "lang": "python", - "label": "Myriad", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Myriad(\n api_key=\"YOUR_API_KEY\",\n wallet_address=\"YOUR_WALLET_ADDRESS\",\n)\nbuilt = exchange.build_order(market_id=\"12345\", side=\"buy\", type=\"limit\", amount=10, price=0.55)\nresult = exchange.submit_order(built)" - }, { "lang": "python", "label": "Opinion", "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Opinion(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n proxy_address=\"YOUR_PROXY_ADDRESS\",\n)\nbuilt = exchange.build_order(market_id=\"12345\", side=\"buy\", type=\"limit\", amount=10, price=0.55)\nresult = exchange.submit_order(built)" }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Metaculus(\n api_token=\"YOUR_API_TOKEN\",\n)\nbuilt = exchange.build_order(market_id=\"12345\", side=\"buy\", type=\"limit\", amount=10, price=0.55)\nresult = exchange.submit_order(built)" - }, { "lang": "python", "label": "Smarkets", @@ -3196,36 +3051,11 @@ "label": "PolymarketUs", "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.PolymarketUs(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nbuilt = exchange.build_order(market_id=\"12345\", side=\"buy\", type=\"limit\", amount=10, price=0.55)\nresult = exchange.submit_order(built)" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Hyperliquid(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nbuilt = exchange.build_order(market_id=\"12345\", side=\"buy\", type=\"limit\", amount=10, price=0.55)\nresult = exchange.submit_order(built)" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.GeminiTitan(\n api_key=\"YOUR_API_KEY\",\n api_secret=\"YOUR_API_SECRET\",\n)\nbuilt = exchange.build_order(market_id=\"12345\", side=\"buy\", type=\"limit\", amount=10, price=0.55)\nresult = exchange.submit_order(built)" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Mock()\nbuilt = exchange.build_order(market_id=\"12345\", side=\"buy\", type=\"limit\", amount=10, price=0.55)\nresult = exchange.submit_order(built)" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Router()\nbuilt = exchange.build_order(market_id=\"12345\", side=\"buy\", type=\"limit\", amount=10, price=0.55)\nresult = exchange.submit_order(built)" - }, { "lang": "javascript", "label": "Polymarket", "source": "import { Polymarket } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Polymarket({\n apiKey: \"YOUR_API_KEY\",\n apiSecret: \"YOUR_API_SECRET\",\n passphrase: \"YOUR_PASSPHRASE\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n proxyAddress: \"YOUR_PROXY_ADDRESS\",\n signatureType: \"gnosis-safe\",\n});\nconst built = await exchange.buildOrder({ marketId: \"12345\", side: \"buy\", type: \"limit\", amount: 10, price: 0.55 });\nconst result = await exchange.submitOrder(built);" }, - { - "lang": "javascript", - "label": "Limitless", - "source": "import { Limitless } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Limitless({\n apiKey: \"YOUR_API_KEY\",\n apiSecret: \"YOUR_API_SECRET\",\n passphrase: \"YOUR_PASSPHRASE\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst built = await exchange.buildOrder({ marketId: \"12345\", side: \"buy\", type: \"limit\", amount: 10, price: 0.55 });\nconst result = await exchange.submitOrder(built);" - }, { "lang": "javascript", "label": "Kalshi", @@ -3236,31 +3066,11 @@ "label": "KalshiDemo", "source": "import { KalshiDemo } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new KalshiDemo({\n apiKey: \"YOUR_API_KEY\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst built = await exchange.buildOrder({ marketId: \"12345\", side: \"buy\", type: \"limit\", amount: 10, price: 0.55 });\nconst result = await exchange.submitOrder(built);" }, - { - "lang": "javascript", - "label": "Probable", - "source": "import { Probable } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Probable({\n apiKey: \"YOUR_API_KEY\",\n apiSecret: \"YOUR_API_SECRET\",\n passphrase: \"YOUR_PASSPHRASE\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst built = await exchange.buildOrder({ marketId: \"12345\", side: \"buy\", type: \"limit\", amount: 10, price: 0.55 });\nconst result = await exchange.submitOrder(built);" - }, - { - "lang": "javascript", - "label": "Baozi", - "source": "import { Baozi } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Baozi({\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst built = await exchange.buildOrder({ marketId: \"12345\", side: \"buy\", type: \"limit\", amount: 10, price: 0.55 });\nconst result = await exchange.submitOrder(built);" - }, - { - "lang": "javascript", - "label": "Myriad", - "source": "import { Myriad } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Myriad({\n apiKey: \"YOUR_API_KEY\",\n walletAddress: \"YOUR_WALLET_ADDRESS\",\n});\nconst built = await exchange.buildOrder({ marketId: \"12345\", side: \"buy\", type: \"limit\", amount: 10, price: 0.55 });\nconst result = await exchange.submitOrder(built);" - }, { "lang": "javascript", "label": "Opinion", "source": "import { Opinion } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Opinion({\n apiKey: \"YOUR_API_KEY\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n proxyAddress: \"YOUR_PROXY_ADDRESS\",\n});\nconst built = await exchange.buildOrder({ marketId: \"12345\", side: \"buy\", type: \"limit\", amount: 10, price: 0.55 });\nconst result = await exchange.submitOrder(built);" }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Metaculus({\n apiToken: \"YOUR_API_TOKEN\",\n});\nconst built = await exchange.buildOrder({ marketId: \"12345\", side: \"buy\", type: \"limit\", amount: 10, price: 0.55 });\nconst result = await exchange.submitOrder(built);" - }, { "lang": "javascript", "label": "Smarkets", @@ -3270,26 +3080,6 @@ "lang": "javascript", "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new PolymarketUs({\n apiKey: \"YOUR_API_KEY\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst built = await exchange.buildOrder({ marketId: \"12345\", side: \"buy\", type: \"limit\", amount: 10, price: 0.55 });\nconst result = await exchange.submitOrder(built);" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Hyperliquid({\n apiKey: \"YOUR_API_KEY\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst built = await exchange.buildOrder({ marketId: \"12345\", side: \"buy\", type: \"limit\", amount: 10, price: 0.55 });\nconst result = await exchange.submitOrder(built);" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new GeminiTitan({\n apiKey: \"YOUR_API_KEY\",\n apiSecret: \"YOUR_API_SECRET\",\n});\nconst built = await exchange.buildOrder({ marketId: \"12345\", side: \"buy\", type: \"limit\", amount: 10, price: 0.55 });\nconst result = await exchange.submitOrder(built);" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Mock();\nconst built = await exchange.buildOrder({ marketId: \"12345\", side: \"buy\", type: \"limit\", amount: 10, price: 0.55 });\nconst result = await exchange.submitOrder(built);" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Router();\nconst built = await exchange.buildOrder({ marketId: \"12345\", side: \"buy\", type: \"limit\", amount: 10, price: 0.55 });\nconst result = await exchange.submitOrder(built);" } ] } @@ -3300,7 +3090,24 @@ "operationId": "cancelOrder", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "probable", + "opinion", + "metaculus", + "smarkets", + "polymarket_us" + ] + }, + "required": true, + "description": "The prediction market exchange to target." } ], "requestBody": { @@ -3390,18 +3197,8 @@ }, { "lang": "python", - "label": "Baozi", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Baozi(\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nresult = exchange.cancel_order(order_id=\"ord-001\")" - }, - { - "lang": "python", - "label": "Myriad", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Myriad(\n api_key=\"YOUR_API_KEY\",\n wallet_address=\"YOUR_WALLET_ADDRESS\",\n)\nresult = exchange.cancel_order(order_id=\"ord-001\")" - }, - { - "lang": "python", - "label": "Opinion", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Opinion(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n proxy_address=\"YOUR_PROXY_ADDRESS\",\n)\nresult = exchange.cancel_order(order_id=\"ord-001\")" + "label": "Opinion", + "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Opinion(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n proxy_address=\"YOUR_PROXY_ADDRESS\",\n)\nresult = exchange.cancel_order(order_id=\"ord-001\")" }, { "lang": "python", @@ -3418,26 +3215,6 @@ "label": "PolymarketUs", "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.PolymarketUs(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nresult = exchange.cancel_order(order_id=\"ord-001\")" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Hyperliquid(\n api_key=\"YOUR_API_KEY\",\n private_key=\"YOUR_PRIVATE_KEY\",\n)\nresult = exchange.cancel_order(order_id=\"ord-001\")" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.GeminiTitan(\n api_key=\"YOUR_API_KEY\",\n api_secret=\"YOUR_API_SECRET\",\n)\nresult = exchange.cancel_order(order_id=\"ord-001\")" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Mock()\nresult = exchange.cancel_order(order_id=\"ord-001\")" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# Runs locally — never proxied through PMXT servers\nexchange = pmxt.Router()\nresult = exchange.cancel_order(order_id=\"ord-001\")" - }, { "lang": "javascript", "label": "Polymarket", @@ -3463,16 +3240,6 @@ "label": "Probable", "source": "import { Probable } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Probable({\n apiKey: \"YOUR_API_KEY\",\n apiSecret: \"YOUR_API_SECRET\",\n passphrase: \"YOUR_PASSPHRASE\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst result = await exchange.cancelOrder({ orderId: \"ord-001\" });" }, - { - "lang": "javascript", - "label": "Baozi", - "source": "import { Baozi } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Baozi({\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst result = await exchange.cancelOrder({ orderId: \"ord-001\" });" - }, - { - "lang": "javascript", - "label": "Myriad", - "source": "import { Myriad } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Myriad({\n apiKey: \"YOUR_API_KEY\",\n walletAddress: \"YOUR_WALLET_ADDRESS\",\n});\nconst result = await exchange.cancelOrder({ orderId: \"ord-001\" });" - }, { "lang": "javascript", "label": "Opinion", @@ -3492,26 +3259,6 @@ "lang": "javascript", "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new PolymarketUs({\n apiKey: \"YOUR_API_KEY\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst result = await exchange.cancelOrder({ orderId: \"ord-001\" });" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Hyperliquid({\n apiKey: \"YOUR_API_KEY\",\n privateKey: \"YOUR_PRIVATE_KEY\",\n});\nconst result = await exchange.cancelOrder({ orderId: \"ord-001\" });" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new GeminiTitan({\n apiKey: \"YOUR_API_KEY\",\n apiSecret: \"YOUR_API_SECRET\",\n});\nconst result = await exchange.cancelOrder({ orderId: \"ord-001\" });" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Mock();\nconst result = await exchange.cancelOrder({ orderId: \"ord-001\" });" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// Runs locally — never proxied through PMXT servers\nconst exchange = new Router();\nconst result = await exchange.cancelOrder({ orderId: \"ord-001\" });" } ] } @@ -3522,7 +3269,23 @@ "operationId": "fetchOrder", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "probable", + "baozi", + "opinion", + "smarkets", + "polymarket_us" + ] + }, + "required": true, + "description": "The prediction market exchange to target." }, { "in": "query", @@ -3565,11 +3328,6 @@ "label": "Polymarket", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Polymarket(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order(order_id=\"ord-001\")" }, - { - "lang": "python", - "label": "Limitless", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Limitless(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order(order_id=\"ord-001\")" - }, { "lang": "python", "label": "Kalshi", @@ -3590,21 +3348,11 @@ "label": "Baozi", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Baozi(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order(order_id=\"ord-001\")" }, - { - "lang": "python", - "label": "Myriad", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Myriad(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order(order_id=\"ord-001\")" - }, { "lang": "python", "label": "Opinion", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order(order_id=\"ord-001\")" }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order(order_id=\"ord-001\")" - }, { "lang": "python", "label": "Smarkets", @@ -3615,36 +3363,11 @@ "label": "PolymarketUs", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order(order_id=\"ord-001\")" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order(order_id=\"ord-001\")" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order(order_id=\"ord-001\")" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order(order_id=\"ord-001\")" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_order(order_id=\"ord-001\")" - }, { "lang": "javascript", "label": "Polymarket", "source": "import { Polymarket } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Polymarket({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrder({ orderId: \"ord-001\" });" }, - { - "lang": "javascript", - "label": "Limitless", - "source": "import { Limitless } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Limitless({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrder({ orderId: \"ord-001\" });" - }, { "lang": "javascript", "label": "Kalshi", @@ -3665,21 +3388,11 @@ "label": "Baozi", "source": "import { Baozi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Baozi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrder({ orderId: \"ord-001\" });" }, - { - "lang": "javascript", - "label": "Myriad", - "source": "import { Myriad } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Myriad({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrder({ orderId: \"ord-001\" });" - }, { "lang": "javascript", "label": "Opinion", "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrder({ orderId: \"ord-001\" });" }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrder({ orderId: \"ord-001\" });" - }, { "lang": "javascript", "label": "Smarkets", @@ -3689,26 +3402,6 @@ "lang": "javascript", "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrder({ orderId: \"ord-001\" });" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrder({ orderId: \"ord-001\" });" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrder({ orderId: \"ord-001\" });" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrder({ orderId: \"ord-001\" });" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOrder({ orderId: \"ord-001\" });" } ] } @@ -3719,7 +3412,25 @@ "operationId": "fetchOpenOrders", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "probable", + "baozi", + "myriad", + "opinion", + "smarkets", + "polymarket_us" + ] + }, + "required": true, + "description": "The prediction market exchange to target." }, { "in": "query", @@ -3800,11 +3511,6 @@ "label": "Opinion", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_open_orders(market_id=\"12345\")" }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_open_orders(market_id=\"12345\")" - }, { "lang": "python", "label": "Smarkets", @@ -3815,26 +3521,6 @@ "label": "PolymarketUs", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_open_orders(market_id=\"12345\")" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_open_orders(market_id=\"12345\")" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_open_orders(market_id=\"12345\")" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_open_orders(market_id=\"12345\")" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_open_orders(market_id=\"12345\")" - }, { "lang": "javascript", "label": "Polymarket", @@ -3875,11 +3561,6 @@ "label": "Opinion", "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOpenOrders({ marketId: \"12345\" });" }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOpenOrders({ marketId: \"12345\" });" - }, { "lang": "javascript", "label": "Smarkets", @@ -3889,26 +3570,6 @@ "lang": "javascript", "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOpenOrders({ marketId: \"12345\" });" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOpenOrders({ marketId: \"12345\" });" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOpenOrders({ marketId: \"12345\" });" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOpenOrders({ marketId: \"12345\" });" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchOpenOrders({ marketId: \"12345\" });" } ] } @@ -3919,7 +3580,24 @@ "operationId": "fetchMyTrades", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "probable", + "myriad", + "opinion", + "smarkets", + "polymarket_us" + ] + }, + "required": true, + "description": "The prediction market exchange to target." }, { "in": "query", @@ -4032,11 +3710,6 @@ "label": "Probable", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Probable(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_my_trades(\n outcome_id=\"67890\",\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" }, - { - "lang": "python", - "label": "Baozi", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Baozi(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_my_trades(\n outcome_id=\"67890\",\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, { "lang": "python", "label": "Myriad", @@ -4047,11 +3720,6 @@ "label": "Opinion", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_my_trades(\n outcome_id=\"67890\",\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_my_trades(\n outcome_id=\"67890\",\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, { "lang": "python", "label": "Smarkets", @@ -4062,26 +3730,6 @@ "label": "PolymarketUs", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_my_trades(\n outcome_id=\"67890\",\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_my_trades(\n outcome_id=\"67890\",\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_my_trades(\n outcome_id=\"67890\",\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_my_trades(\n outcome_id=\"67890\",\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_my_trades(\n outcome_id=\"67890\",\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, { "lang": "javascript", "label": "Polymarket", @@ -4107,11 +3755,6 @@ "label": "Probable", "source": "import { Probable } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Probable({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchMyTrades({\n outcomeId: \"67890\",\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" }, - { - "lang": "javascript", - "label": "Baozi", - "source": "import { Baozi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Baozi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchMyTrades({\n outcomeId: \"67890\",\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, { "lang": "javascript", "label": "Myriad", @@ -4122,11 +3765,6 @@ "label": "Opinion", "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchMyTrades({\n outcomeId: \"67890\",\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchMyTrades({\n outcomeId: \"67890\",\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, { "lang": "javascript", "label": "Smarkets", @@ -4136,26 +3774,6 @@ "lang": "javascript", "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchMyTrades({\n outcomeId: \"67890\",\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchMyTrades({\n outcomeId: \"67890\",\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchMyTrades({\n outcomeId: \"67890\",\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchMyTrades({\n outcomeId: \"67890\",\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchMyTrades({\n outcomeId: \"67890\",\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" } ] } @@ -4166,7 +3784,20 @@ "operationId": "fetchClosedOrders", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "kalshi", + "kalshi-demo", + "limitless", + "opinion", + "smarkets" + ] + }, + "required": true, + "description": "The prediction market exchange to target." }, { "in": "query", @@ -4245,11 +3876,6 @@ }, "security": [], "x-codeSamples": [ - { - "lang": "python", - "label": "Polymarket", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Polymarket(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_closed_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, { "lang": "python", "label": "Limitless", @@ -4265,135 +3891,40 @@ "label": "KalshiDemo", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.KalshiDemo(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_closed_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" }, - { - "lang": "python", - "label": "Probable", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Probable(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_closed_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "python", - "label": "Baozi", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Baozi(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_closed_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "python", - "label": "Myriad", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Myriad(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_closed_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, { "lang": "python", "label": "Opinion", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_closed_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_closed_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, { "lang": "python", "label": "Smarkets", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Smarkets(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_closed_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" }, { - "lang": "python", - "label": "PolymarketUs", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_closed_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" + "lang": "javascript", + "label": "Limitless", + "source": "import { Limitless } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Limitless({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" }, { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_closed_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" + "lang": "javascript", + "label": "Kalshi", + "source": "import { Kalshi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Kalshi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" }, { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_closed_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_closed_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_closed_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "javascript", - "label": "Polymarket", - "source": "import { Polymarket } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Polymarket({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Limitless", - "source": "import { Limitless } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Limitless({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Kalshi", - "source": "import { Kalshi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Kalshi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "KalshiDemo", - "source": "import { KalshiDemo } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new KalshiDemo({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Probable", - "source": "import { Probable } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Probable({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Baozi", - "source": "import { Baozi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Baozi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Myriad", - "source": "import { Myriad } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Myriad({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" + "lang": "javascript", + "label": "KalshiDemo", + "source": "import { KalshiDemo } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new KalshiDemo({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" }, { "lang": "javascript", "label": "Opinion", "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, { "lang": "javascript", "label": "Smarkets", "source": "import { Smarkets } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Smarkets({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "PolymarketUs", - "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchClosedOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" } ] } @@ -4404,7 +3935,20 @@ "operationId": "fetchAllOrders", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "kalshi", + "kalshi-demo", + "limitless", + "opinion", + "smarkets" + ] + }, + "required": true, + "description": "The prediction market exchange to target." }, { "in": "query", @@ -4483,11 +4027,6 @@ }, "security": [], "x-codeSamples": [ - { - "lang": "python", - "label": "Polymarket", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Polymarket(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_all_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, { "lang": "python", "label": "Limitless", @@ -4503,66 +4042,16 @@ "label": "KalshiDemo", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.KalshiDemo(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_all_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" }, - { - "lang": "python", - "label": "Probable", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Probable(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_all_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "python", - "label": "Baozi", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Baozi(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_all_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "python", - "label": "Myriad", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Myriad(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_all_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, { "lang": "python", "label": "Opinion", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_all_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_all_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, { "lang": "python", "label": "Smarkets", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Smarkets(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_all_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" }, - { - "lang": "python", - "label": "PolymarketUs", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_all_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_all_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_all_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_all_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_all_orders(\n market_id=\"12345\",\n since=\"value\",\n until=\"value\",\n limit=10,\n cursor=\"abc123\",\n)" - }, - { - "lang": "javascript", - "label": "Polymarket", - "source": "import { Polymarket } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Polymarket({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchAllOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, { "lang": "javascript", "label": "Limitless", @@ -4578,60 +4067,15 @@ "label": "KalshiDemo", "source": "import { KalshiDemo } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new KalshiDemo({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchAllOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" }, - { - "lang": "javascript", - "label": "Probable", - "source": "import { Probable } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Probable({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchAllOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Baozi", - "source": "import { Baozi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Baozi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchAllOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Myriad", - "source": "import { Myriad } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Myriad({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchAllOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, { "lang": "javascript", "label": "Opinion", "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchAllOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchAllOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, { "lang": "javascript", "label": "Smarkets", "source": "import { Smarkets } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Smarkets({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchAllOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "PolymarketUs", - "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchAllOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchAllOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchAllOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchAllOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchAllOrders({\n marketId: \"12345\",\n since: \"value\",\n until: \"value\",\n limit: 10,\n cursor: \"abc123\",\n});" } ] } @@ -4642,7 +4086,25 @@ "operationId": "fetchPositions", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "probable", + "baozi", + "myriad", + "opinion", + "smarkets", + "polymarket_us" + ] + }, + "required": true, + "description": "The prediction market exchange to target." }, { "in": "query", @@ -4723,11 +4185,6 @@ "label": "Opinion", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_positions(address=\"0xabc...\")" }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_positions(address=\"0xabc...\")" - }, { "lang": "python", "label": "Smarkets", @@ -4738,26 +4195,6 @@ "label": "PolymarketUs", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_positions(address=\"0xabc...\")" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_positions(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_positions(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_positions(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_positions(address=\"0xabc...\")" - }, { "lang": "javascript", "label": "Polymarket", @@ -4798,11 +4235,6 @@ "label": "Opinion", "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchPositions({ address: \"0xabc...\" });" }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchPositions({ address: \"0xabc...\" });" - }, { "lang": "javascript", "label": "Smarkets", @@ -4812,26 +4244,6 @@ "lang": "javascript", "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchPositions({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchPositions({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchPositions({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchPositions({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchPositions({ address: \"0xabc...\" });" } ] } @@ -4842,7 +4254,24 @@ "operationId": "fetchBalance", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "probable", + "baozi", + "myriad", + "smarkets", + "polymarket_us" + ] + }, + "required": true, + "description": "The prediction market exchange to target." }, { "in": "query", @@ -4918,16 +4347,6 @@ "label": "Myriad", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Myriad(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_balance(address=\"0xabc...\")" }, - { - "lang": "python", - "label": "Opinion", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_balance(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_balance(address=\"0xabc...\")" - }, { "lang": "python", "label": "Smarkets", @@ -4938,26 +4357,6 @@ "label": "PolymarketUs", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_balance(address=\"0xabc...\")" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_balance(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_balance(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_balance(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.fetch_balance(address=\"0xabc...\")" - }, { "lang": "javascript", "label": "Polymarket", @@ -4993,16 +4392,6 @@ "label": "Myriad", "source": "import { Myriad } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Myriad({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchBalance({ address: \"0xabc...\" });" }, - { - "lang": "javascript", - "label": "Opinion", - "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchBalance({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchBalance({ address: \"0xabc...\" });" - }, { "lang": "javascript", "label": "Smarkets", @@ -5012,26 +4401,6 @@ "lang": "javascript", "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchBalance({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchBalance({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchBalance({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchBalance({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.fetchBalance({ address: \"0xabc...\" });" } ] } @@ -5968,11 +5337,28 @@ "operationId": "watchOrderBook", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" - } - ], - "requestBody": { - "content": { + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "probable", + "baozi", + "myriad", + "opinion", + "polymarket_us" + ] + }, + "required": true, + "description": "The prediction market exchange to target." + } + ], + "requestBody": { + "content": { "application/json": { "schema": { "title": "WatchOrderBookRequest", @@ -6071,41 +5457,11 @@ "label": "Opinion", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_book(id=\"12345\")" }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_book(id=\"12345\")" - }, - { - "lang": "python", - "label": "Smarkets", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Smarkets(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_book(id=\"12345\")" - }, { "lang": "python", "label": "PolymarketUs", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_book(id=\"12345\")" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_book(id=\"12345\")" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_book(id=\"12345\")" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_book(id=\"12345\")" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_book(id=\"12345\")" - }, { "lang": "javascript", "label": "Polymarket", @@ -6146,40 +5502,10 @@ "label": "Opinion", "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBook({ id: \"12345\" });" }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBook({ id: \"12345\" });" - }, - { - "lang": "javascript", - "label": "Smarkets", - "source": "import { Smarkets } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Smarkets({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBook({ id: \"12345\" });" - }, { "lang": "javascript", "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBook({ id: \"12345\" });" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBook({ id: \"12345\" });" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBook({ id: \"12345\" });" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBook({ id: \"12345\" });" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBook({ id: \"12345\" });" } ] } @@ -6190,7 +5516,24 @@ "operationId": "watchOrderBooks", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "probable", + "baozi", + "myriad", + "opinion", + "polymarket_us" + ] + }, + "required": true, + "description": "The prediction market exchange to target." } ], "requestBody": { @@ -6299,41 +5642,11 @@ "label": "Opinion", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_books()" }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_books()" - }, - { - "lang": "python", - "label": "Smarkets", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Smarkets(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_books()" - }, { "lang": "python", "label": "PolymarketUs", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_books()" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_books()" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_books()" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_books()" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_order_books()" - }, { "lang": "javascript", "label": "Polymarket", @@ -6374,40 +5687,10 @@ "label": "Opinion", "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBooks();" }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBooks();" - }, - { - "lang": "javascript", - "label": "Smarkets", - "source": "import { Smarkets } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Smarkets({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBooks();" - }, { "lang": "javascript", "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBooks();" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBooks();" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBooks();" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBooks();" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchOrderBooks();" } ] } @@ -6418,7 +5701,16 @@ "operationId": "unwatchOrderBook", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket" + ] + }, + "required": true, + "description": "The prediction market exchange to target." } ], "requestBody": { @@ -6467,150 +5759,10 @@ "label": "Polymarket", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Polymarket(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" }, - { - "lang": "python", - "label": "Limitless", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Limitless(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, - { - "lang": "python", - "label": "Kalshi", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Kalshi(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, - { - "lang": "python", - "label": "KalshiDemo", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.KalshiDemo(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, - { - "lang": "python", - "label": "Probable", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Probable(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, - { - "lang": "python", - "label": "Baozi", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Baozi(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, - { - "lang": "python", - "label": "Myriad", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Myriad(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, - { - "lang": "python", - "label": "Opinion", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, - { - "lang": "python", - "label": "Smarkets", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Smarkets(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, - { - "lang": "python", - "label": "PolymarketUs", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_order_book()" - }, { "lang": "javascript", "label": "Polymarket", "source": "import { Polymarket } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Polymarket({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "Limitless", - "source": "import { Limitless } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Limitless({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "Kalshi", - "source": "import { Kalshi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Kalshi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "KalshiDemo", - "source": "import { KalshiDemo } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new KalshiDemo({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "Probable", - "source": "import { Probable } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Probable({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "Baozi", - "source": "import { Baozi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Baozi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "Myriad", - "source": "import { Myriad } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Myriad({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "Opinion", - "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "Smarkets", - "source": "import { Smarkets } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Smarkets({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "PolymarketUs", - "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchOrderBook();" } ] } @@ -6621,7 +5773,22 @@ "operationId": "watchTrades", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "kalshi", + "kalshi-demo", + "limitless", + "myriad", + "opinion", + "polymarket_us" + ] + }, + "required": true, + "description": "The prediction market exchange to target." } ], "requestBody": { @@ -6713,16 +5880,6 @@ "label": "KalshiDemo", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.KalshiDemo(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_trades(id=\"12345\")" }, - { - "lang": "python", - "label": "Probable", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Probable(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_trades(id=\"12345\")" - }, - { - "lang": "python", - "label": "Baozi", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Baozi(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_trades(id=\"12345\")" - }, { "lang": "python", "label": "Myriad", @@ -6733,41 +5890,11 @@ "label": "Opinion", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_trades(id=\"12345\")" }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_trades(id=\"12345\")" - }, - { - "lang": "python", - "label": "Smarkets", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Smarkets(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_trades(id=\"12345\")" - }, { "lang": "python", "label": "PolymarketUs", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_trades(id=\"12345\")" }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_trades(id=\"12345\")" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_trades(id=\"12345\")" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_trades(id=\"12345\")" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_trades(id=\"12345\")" - }, { "lang": "javascript", "label": "Polymarket", @@ -6788,16 +5915,6 @@ "label": "KalshiDemo", "source": "import { KalshiDemo } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new KalshiDemo({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchTrades({ id: \"12345\" });" }, - { - "lang": "javascript", - "label": "Probable", - "source": "import { Probable } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Probable({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchTrades({ id: \"12345\" });" - }, - { - "lang": "javascript", - "label": "Baozi", - "source": "import { Baozi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Baozi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchTrades({ id: \"12345\" });" - }, { "lang": "javascript", "label": "Myriad", @@ -6808,40 +5925,10 @@ "label": "Opinion", "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchTrades({ id: \"12345\" });" }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchTrades({ id: \"12345\" });" - }, - { - "lang": "javascript", - "label": "Smarkets", - "source": "import { Smarkets } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Smarkets({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchTrades({ id: \"12345\" });" - }, { "lang": "javascript", "label": "PolymarketUs", "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchTrades({ id: \"12345\" });" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchTrades({ id: \"12345\" });" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchTrades({ id: \"12345\" });" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchTrades({ id: \"12345\" });" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchTrades({ id: \"12345\" });" } ] } @@ -6852,7 +5939,17 @@ "operationId": "watchAddress", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "limitless" + ] + }, + "required": true, + "description": "The prediction market exchange to target." } ], "requestBody": { @@ -6928,71 +6025,6 @@ "label": "Limitless", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Limitless(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" }, - { - "lang": "python", - "label": "Kalshi", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Kalshi(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "KalshiDemo", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.KalshiDemo(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Probable", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Probable(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Baozi", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Baozi(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Myriad", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Myriad(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Opinion", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Smarkets", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Smarkets(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "PolymarketUs", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.watch_address(address=\"0xabc...\")" - }, { "lang": "javascript", "label": "Polymarket", @@ -7002,71 +6034,6 @@ "lang": "javascript", "label": "Limitless", "source": "import { Limitless } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Limitless({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Kalshi", - "source": "import { Kalshi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Kalshi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "KalshiDemo", - "source": "import { KalshiDemo } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new KalshiDemo({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Probable", - "source": "import { Probable } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Probable({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Baozi", - "source": "import { Baozi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Baozi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Myriad", - "source": "import { Myriad } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Myriad({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Opinion", - "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Smarkets", - "source": "import { Smarkets } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Smarkets({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "PolymarketUs", - "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.watchAddress({ address: \"0xabc...\" });" } ] } @@ -7077,7 +6044,17 @@ "operationId": "unwatchAddress", "parameters": [ { - "$ref": "#/components/parameters/ExchangeParam" + "in": "path", + "name": "exchange", + "schema": { + "type": "string", + "enum": [ + "polymarket", + "limitless" + ] + }, + "required": true, + "description": "The prediction market exchange to target." } ], "requestBody": { @@ -7131,71 +6108,6 @@ "label": "Limitless", "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Limitless(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" }, - { - "lang": "python", - "label": "Kalshi", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Kalshi(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "KalshiDemo", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.KalshiDemo(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Probable", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Probable(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Baozi", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Baozi(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Myriad", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Myriad(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Opinion", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Opinion(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Metaculus", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Metaculus(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Smarkets", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Smarkets(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "PolymarketUs", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.PolymarketUs(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Hyperliquid", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Hyperliquid(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "GeminiTitan", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.GeminiTitan(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Mock", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Mock(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" - }, - { - "lang": "python", - "label": "Router", - "source": "import pmxt\n\n# API key optional — enables faster catalog-backed lookups\nexchange = pmxt.Router(\n pmxt_api_key=\"YOUR_PMXT_API_KEY\",\n)\nresult = exchange.unwatch_address(address=\"0xabc...\")" - }, { "lang": "javascript", "label": "Polymarket", @@ -7205,71 +6117,6 @@ "lang": "javascript", "label": "Limitless", "source": "import { Limitless } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Limitless({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Kalshi", - "source": "import { Kalshi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Kalshi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "KalshiDemo", - "source": "import { KalshiDemo } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new KalshiDemo({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Probable", - "source": "import { Probable } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Probable({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Baozi", - "source": "import { Baozi } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Baozi({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Myriad", - "source": "import { Myriad } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Myriad({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Opinion", - "source": "import { Opinion } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Opinion({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Metaculus", - "source": "import { Metaculus } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Metaculus({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Smarkets", - "source": "import { Smarkets } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Smarkets({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "PolymarketUs", - "source": "import { PolymarketUs } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new PolymarketUs({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Hyperliquid", - "source": "import { Hyperliquid } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Hyperliquid({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "GeminiTitan", - "source": "import { GeminiTitan } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new GeminiTitan({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Mock", - "source": "import { Mock } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Mock({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" - }, - { - "lang": "javascript", - "label": "Router", - "source": "import { Router } from \"pmxtjs\";\n\n// API key optional — enables faster catalog-backed lookups\nconst exchange = new Router({\n pmxtApiKey: \"YOUR_PMXT_API_KEY\",\n});\nconst result = await exchange.unwatchAddress({ address: \"0xabc...\" });" } ] } diff --git a/docs/docs.json b/docs/docs.json index fbfdf30e..0aa73625 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -146,6 +146,7 @@ "pages": [ "api-reference/fetch-ohlcv", "GET /api/{exchange}/fetchOrderBook", + "POST /api/{exchange}/fetchOrderBooks", "GET /api/{exchange}/fetchTrades", "POST /api/{exchange}/getExecutionPrice", "POST /api/{exchange}/getExecutionPriceDetailed" diff --git a/scripts/generate-mintlify-docs.js b/scripts/generate-mintlify-docs.js index 7ea9a55a..d8d4506d 100644 --- a/scripts/generate-mintlify-docs.js +++ b/scripts/generate-mintlify-docs.js @@ -166,7 +166,7 @@ const ENDPOINT_GROUPS = [ { name: 'Order Book & Trades', match: (opId) => - /^(fetchOrderBook|fetchOHLCV|fetchTrades|getExecutionPrice|getExecutionPriceDetailed)$/.test( + /^(fetchOrderBook|fetchOrderBooks|fetchOHLCV|fetchTrades|getExecutionPrice|getExecutionPriceDetailed)$/.test( opId ), }, diff --git a/sdks/python/API_REFERENCE.md b/sdks/python/API_REFERENCE.md index 5695b920..47174532 100644 --- a/sdks/python/API_REFERENCE.md +++ b/sdks/python/API_REFERENCE.md @@ -356,12 +356,12 @@ Fetch historical OHLCV (candlestick) price data for a specific market outcome. **Signature:** ```python -def fetch_ohlcv(id: str, params: OHLCVParams) -> List[PriceCandle]: +def fetch_ohlcv(outcome_id: str, params: OHLCVParams) -> List[PriceCandle]: ``` **Parameters:** -- `id` (str): The Outcome ID (outcomeId). Use outcome.outcomeId, NOT market.marketId +- `outcome_id` (str): The Outcome ID (outcomeId). Use outcome.outcomeId, NOT market.marketId - `params` ([OHLCVParams](#ohlcvparams)): OHLCV parameters including resolution (required) **Returns:** List[[PriceCandle](#pricecandle)] - Array of price candles @@ -369,7 +369,7 @@ def fetch_ohlcv(id: str, params: OHLCVParams) -> List[PriceCandle]: **Example:** ```python -exchange.fetch_ohlcv(id="12345", params="...") +exchange.fetch_ohlcv(outcome_id="abc123", params="...") ``` **Notes:** @@ -386,19 +386,45 @@ Fetch the current order book (bids/asks) for a specific outcome. **Signature:** ```python -def fetch_order_book(id: str) -> OrderBook: +def fetch_order_book(outcome_id: str, side: Optional['yes' | 'no'] = None) -> OrderBook: ``` **Parameters:** -- `id` (str): The Outcome ID (outcomeId) +- `outcome_id` (str): The Outcome ID (outcomeId) or market slug +- `side` ('yes' | 'no') - **Optional**: Optional 'yes' or 'no' to explicitly indicate the **Returns:** [OrderBook](#orderbook) - Current order book with bids and asks **Example:** ```python -exchange.fetch_order_book(id="12345") +exchange.fetch_order_book(outcome_id="abc123", side="buy") +``` + + +--- +### `fetch_order_books` + +Batch variant of {@link fetchOrderBook}. Fetches order books for + + +**Signature:** + +```python +def fetch_order_books(outcome_ids: List[string]) -> Dictstr, [OrderBook]: +``` + +**Parameters:** + +- `outcome_ids` (List[string]): List of Outcome IDs (outcomeId). Each id must be in the + +**Returns:** Dict[str, [OrderBook](#orderbook)] - A map keyed by the input id (preserving the caller's exact + +**Example:** + +```python +exchange.fetch_order_books(outcome_ids="12345") ``` @@ -411,12 +437,12 @@ Fetch raw trade history for a specific outcome. **Signature:** ```python -def fetch_trades(id: str, params: TradesParams | HistoryFilterParams) -> List[Trade]: +def fetch_trades(outcome_id: str, params: TradesParams | HistoryFilterParams) -> List[Trade]: ``` **Parameters:** -- `id` (str): The Outcome ID (outcomeId) +- `outcome_id` (str): The Outcome ID (outcomeId) - `params` (TradesParams | HistoryFilterParams): Trade filter parameters **Returns:** List[[Trade](#trade)] - Array of recent trades @@ -424,7 +450,7 @@ def fetch_trades(id: str, params: TradesParams | HistoryFilterParams) -> List[Tr **Example:** ```python -exchange.fetch_trades(id="12345", params="...") +exchange.fetch_trades(outcome_id="abc123", params="...") ``` **Notes:** @@ -745,12 +771,12 @@ Watch order book updates in real-time via WebSocket. **Signature:** ```python -def watch_order_book(id: str, limit: Optional[float] = None) -> OrderBook: +def watch_order_book(outcome_id: str, limit: Optional[float] = None) -> OrderBook: ``` **Parameters:** -- `id` (str): The Outcome ID to watch +- `outcome_id` (str): The Outcome ID to watch - `limit` (float) - **Optional**: Optional limit for orderbook depth **Returns:** [OrderBook](#orderbook) - Promise that resolves with the current orderbook state @@ -758,7 +784,7 @@ def watch_order_book(id: str, limit: Optional[float] = None) -> OrderBook: **Example:** ```python -exchange.watch_order_book(id="12345", limit=10) +exchange.watch_order_book(outcome_id="abc123", limit=10) ``` @@ -771,12 +797,12 @@ Watch multiple order books simultaneously via WebSocket. **Signature:** ```python -def watch_order_books(ids: List[string], limit: Optional[float] = None) -> Dictstr, [OrderBook]: +def watch_order_books(outcome_ids: List[string], limit: Optional[float] = None) -> Dictstr, [OrderBook]: ``` **Parameters:** -- `ids` (List[string]): Array of Outcome IDs to watch +- `outcome_ids` (List[string]): Array of Outcome IDs to watch - `limit` (float) - **Optional**: Optional limit for orderbook depth **Returns:** Dict[str, [OrderBook](#orderbook)] - Promise that resolves with order books keyed by ID @@ -784,7 +810,7 @@ def watch_order_books(ids: List[string], limit: Optional[float] = None) -> Dicts **Example:** ```python -exchange.watch_order_books(ids="12345", limit=10) +exchange.watch_order_books(outcome_ids="12345", limit=10) ``` @@ -797,19 +823,19 @@ Unsubscribe from a previously watched order book stream. **Signature:** ```python -def unwatch_order_book(id: str) -> void: +def unwatch_order_book(outcome_id: str) -> void: ``` **Parameters:** -- `id` (str): The Outcome ID to stop watching +- `outcome_id` (str): The Outcome ID to stop watching **Returns:** void - Result **Example:** ```python -exchange.unwatch_order_book(id="12345") +exchange.unwatch_order_book(outcome_id="abc123") ``` @@ -822,12 +848,12 @@ Watch trade executions in real-time via WebSocket. **Signature:** ```python -def watch_trades(id: str, address: Optional[str] = None, since: Optional[float] = None, limit: Optional[float] = None) -> List[Trade]: +def watch_trades(outcome_id: str, address: Optional[str] = None, since: Optional[float] = None, limit: Optional[float] = None) -> List[Trade]: ``` **Parameters:** -- `id` (str): The Outcome ID to watch +- `outcome_id` (str): The Outcome ID to watch - `address` (str) - **Optional**: Public wallet address - `since` (float) - **Optional**: Optional timestamp to filter trades from - `limit` (float) - **Optional**: Optional limit for number of trades @@ -837,7 +863,7 @@ def watch_trades(id: str, address: Optional[str] = None, since: Optional[float] **Example:** ```python -exchange.watch_trades(id="12345", address="0xabc...", since="...") +exchange.watch_trades(outcome_id="abc123", address="0xabc...", since="...") ``` @@ -893,7 +919,7 @@ exchange.unwatch_address(address="0xabc...") --- -### `close` +### `test_dummy_method` Close all WebSocket connections and clean up resources. @@ -901,19 +927,19 @@ Close all WebSocket connections and clean up resources. **Signature:** ```python -def close() -> void: +def test_dummy_method(param: Optional[str] = None) -> str: ``` **Parameters:** -- None +- `param` (str) - **Optional**: param -**Returns:** void - Result +**Returns:** str - Result **Example:** ```python -exchange.close() +exchange.test_dummy_method(param="...") ``` @@ -1549,10 +1575,12 @@ type: str # Order type: market (execute immediately) or limit (resting at a pric price: float # For limit orders amount: float # Size in contracts/shares status: str # Lifecycle status of the order. -filled: float # Amount filled +filled: float # Amount filled (USDC cost for buys, shares for sells) +filled_shares: float # Amount filled in shares/contracts (if different from USDC-denominated `filled`). remaining: float # Amount remaining timestamp: float # Unix timestamp in milliseconds when the order was created. fee: float # Fee paid for this order, if known. +fee_rate_bps: float # Fee rate in basis points applied to this order (e.g. 100 = 1%). ``` --- @@ -1778,6 +1806,8 @@ api_token: str # Metaculus: `Authorization: Token ` for higher rate li private_key: str # Required for Polymarket L1 auth signature_type: Any # 0 = EOA, 1 = Poly Proxy, 2 = Gnosis Safe (Can also use 'eoa', 'polyproxy', 'gnosis_safe') funder_address: str # The address funding the trades (defaults to signer address) +wallet_address: str # +base_url: str # ``` --- @@ -1895,6 +1925,7 @@ price: float # Required for limit orders fee: float # Optional fee rate (e.g., 1000 for 0.1%) tick_size: float # Optional override for Limitless/Polymarket neg_risk: bool # Optional override to skip neg-risk lookup (Polymarket) +on_behalf_of: float # Limitless delegated signing: profile ID to trade on behalf of ``` --- @@ -2917,6 +2948,7 @@ Get aggregated builder leaderboard | `GetStructuredTargets` | `GET` | `/structured_targets` | Get Structured Targets | Public | | `GetStructuredTarget` | `GET` | `/structured_targets/{structured_target_id}` | Get Structured Target | Public | | `GetMarketOrderbook` | `GET` | `/markets/{ticker}/orderbook` | Get Market Orderbook | Required | +| `GetMarketOrderbooks` | `GET` | `/markets/orderbooks` | Get Multiple Market Orderbooks | Required | | `GetMilestone` | `GET` | `/milestones/{milestone_id}` | Get Milestone | Public | | `GetMilestones` | `GET` | `/milestones` | Get Milestones | Public | | `GetCommunicationsID` | `GET` | `/communications/id` | Get Communications ID | Required | @@ -3602,6 +3634,16 @@ Get Market Orderbook *(Auth required)* - `` (, string) - `depth` (query, integer) — Depth of the orderbook to retrieve (0 or negative means all levels, 1-100 for specific depth) +--- +##### `GetMarketOrderbooks` + +**GET** `/markets/orderbooks` + +Get Multiple Market Orderbooks *(Auth required)* + +**Parameters:** +- `tickers` (query, array) **required** — List of market tickers to fetch orderbooks for + --- ##### `GetMilestone` diff --git a/sdks/python/pmxt/__init__.py b/sdks/python/pmxt/__init__.py index 9a99a7ed..f1996569 100644 --- a/sdks/python/pmxt/__init__.py +++ b/sdks/python/pmxt/__init__.py @@ -17,7 +17,7 @@ """ from .client import Exchange -from ._exchanges import Polymarket, Limitless, Kalshi, KalshiDemo, Probable, Baozi, Myriad, Opinion, Metaculus, Smarkets, Polymarket_us, Router +from ._exchanges import Polymarket, Limitless, Kalshi, KalshiDemo, Probable, Baozi, Myriad, Opinion, Metaculus, Smarkets, Polymarket_us, Hyperliquid, GeminiTitan, Mock, Router from .router import Router from .server_manager import ServerManager from .errors import ( @@ -144,6 +144,9 @@ def restart_server(): "Metaculus", "Smarkets", "Polymarket_us", + "Hyperliquid", + "GeminiTitan", + "Mock", "Router", "Exchange", # Server Management diff --git a/sdks/python/pmxt/_exchanges.py b/sdks/python/pmxt/_exchanges.py index cf58230e..03eece68 100644 --- a/sdks/python/pmxt/_exchanges.py +++ b/sdks/python/pmxt/_exchanges.py @@ -396,6 +396,100 @@ def __init__( ) +class Hyperliquid(Exchange): + """Hyperliquid exchange client.""" + + def __init__( + self, + api_key: Optional[str] = None, + private_key: Optional[str] = None, + base_url: Optional[str] = None, + auto_start_server: Optional[bool] = None, + pmxt_api_key: Optional[str] = None, + ): + """ + Initialize Hyperliquid client. + + Args: + api_key: API key for authentication (optional) + private_key: Private key for authentication (optional) + base_url: Base URL of the PMXT sidecar server + auto_start_server: Automatically start server if not running (default: True) + pmxt_api_key: Hosted PMXT API key (optional; enables hosted mode) + """ + super().__init__( + exchange_name="hyperliquid", + api_key=api_key, + private_key=private_key, + base_url=base_url, + auto_start_server=auto_start_server, + pmxt_api_key=pmxt_api_key, + ) + + +class GeminiTitan(Exchange): + """GeminiTitan exchange client.""" + + def __init__( + self, + api_key: Optional[str] = None, + api_secret: Optional[str] = None, + base_url: Optional[str] = None, + auto_start_server: Optional[bool] = None, + pmxt_api_key: Optional[str] = None, + ): + """ + Initialize GeminiTitan client. + + Args: + api_key: API key for authentication (optional) + api_secret: API secret for authentication (optional) + base_url: Base URL of the PMXT sidecar server + auto_start_server: Automatically start server if not running (default: True) + pmxt_api_key: Hosted PMXT API key (optional; enables hosted mode) + """ + super().__init__( + exchange_name="gemini-titan", + api_key=api_key, + base_url=base_url, + auto_start_server=auto_start_server, + pmxt_api_key=pmxt_api_key, + ) + + self.api_secret = api_secret + + def _get_credentials_dict(self) -> Optional[Dict[str, Any]]: + creds = super()._get_credentials_dict() or {} + if self.api_secret: + creds["apiSecret"] = self.api_secret + return creds if creds else None + + +class Mock(Exchange): + """Mock exchange client.""" + + def __init__( + self, + base_url: Optional[str] = None, + auto_start_server: Optional[bool] = None, + pmxt_api_key: Optional[str] = None, + ): + """ + Initialize Mock client. + + Args: + base_url: Base URL of the PMXT sidecar server + auto_start_server: Automatically start server if not running (default: True) + pmxt_api_key: Hosted PMXT API key (optional; enables hosted mode) + """ + super().__init__( + exchange_name="mock", + base_url=base_url, + auto_start_server=auto_start_server, + pmxt_api_key=pmxt_api_key, + ) + + class Router(Exchange): """Router exchange client.""" diff --git a/sdks/python/pmxt/client.py b/sdks/python/pmxt/client.py index 8a80f4ca..512b35f9 100644 --- a/sdks/python/pmxt/client.py +++ b/sdks/python/pmxt/client.py @@ -22,7 +22,6 @@ from pmxt_internal import ApiClient, Configuration from pmxt_internal.api.default_api import DefaultApi from pmxt_internal.exceptions import ApiException -from pmxt_internal import models as internal_models from .models import ( UnifiedMarket, @@ -874,6 +873,26 @@ def fetch_order_book(self, outcome_id: Union[str, "MarketOutcome"] = _UNSET, sid except ApiException as e: raise self._parse_api_exception(e) from None + def fetch_order_books(self, ids: List[str]) -> Dict[str, OrderBook]: + try: + args = [] + args.append(ids) + body: dict = {"args": args} + creds = self._get_credentials_dict() + if creds: + body["credentials"] = creds + url = f"{self._resolve_sidecar_host()}/api/{self.exchange_name}/fetchOrderBooks" + headers = {"Content-Type": "application/json", "Accept": "application/json"} + headers.update(self._get_auth_headers()) + response = self._fetch_with_retry( + lambda: self._api_client.call_api(method="POST", url=url, body=body, header_params=headers) + ) + response.read() + data = self._handle_response(json.loads(response.data)) + return {key: _convert_order_book(value) for key, value in (data or {}).items()} + except ApiException as e: + raise self._parse_api_exception(e) from None + def cancel_order(self, order_id: str) -> Order: try: args = [] diff --git a/sdks/typescript/API_REFERENCE.md b/sdks/typescript/API_REFERENCE.md index 14a8e3ce..2b517cd4 100644 --- a/sdks/typescript/API_REFERENCE.md +++ b/sdks/typescript/API_REFERENCE.md @@ -359,12 +359,12 @@ Fetch historical OHLCV (candlestick) price data for a specific market outcome. **Signature:** ```typescript -async fetchOHLCV(id: string, params: OHLCVParams): Promise +async fetchOHLCV(outcomeId: string, params: OHLCVParams): Promise ``` **Parameters:** -- `id` (string): The Outcome ID (outcomeId). Use outcome.outcomeId, NOT market.marketId +- `outcomeId` (string): The Outcome ID (outcomeId). Use outcome.outcomeId, NOT market.marketId - `params` ([OHLCVParams](#ohlcvparams)): OHLCV parameters including resolution (required) **Returns:** Promise<[PriceCandle](#pricecandle)[]> - Array of price candles @@ -372,7 +372,7 @@ async fetchOHLCV(id: string, params: OHLCVParams): Promise **Example:** ```typescript -await exchange.fetchOHLCV("12345", "...") +await exchange.fetchOHLCV("abc123", "...") ``` **Notes:** @@ -389,19 +389,45 @@ Fetch the current order book (bids/asks) for a specific outcome. **Signature:** ```typescript -async fetchOrderBook(id: string): Promise +async fetchOrderBook(outcomeId: string, side?: 'yes' | 'no'): Promise ``` **Parameters:** -- `id` (string): The Outcome ID (outcomeId) +- `outcomeId` (string): The Outcome ID (outcomeId) or market slug +- `side` ('yes' | 'no') - **Optional**: Optional 'yes' or 'no' to explicitly indicate the **Returns:** Promise<[OrderBook](#orderbook)> - Current order book with bids and asks **Example:** ```typescript -await exchange.fetchOrderBook("12345") +await exchange.fetchOrderBook("abc123", { side: "buy" }) +``` + + +--- +### `fetchOrderBooks` + +Batch variant of {@link fetchOrderBook}. Fetches order books for + + +**Signature:** + +```typescript +async fetchOrderBooks(outcomeIds: string[]): Promise> +``` + +**Parameters:** + +- `outcomeIds` (string[]): List of Outcome IDs (outcomeId). Each id must be in the + +**Returns:** Promise> - A map keyed by the input id (preserving the caller's exact + +**Example:** + +```typescript +await exchange.fetchOrderBooks("12345") ``` @@ -414,12 +440,12 @@ Fetch raw trade history for a specific outcome. **Signature:** ```typescript -async fetchTrades(id: string, params: TradesParams | HistoryFilterParams): Promise +async fetchTrades(outcomeId: string, params: TradesParams | HistoryFilterParams): Promise ``` **Parameters:** -- `id` (string): The Outcome ID (outcomeId) +- `outcomeId` (string): The Outcome ID (outcomeId) - `params` (TradesParams | HistoryFilterParams): Trade filter parameters **Returns:** Promise<[Trade](#trade)[]> - Array of recent trades @@ -427,7 +453,7 @@ async fetchTrades(id: string, params: TradesParams | HistoryFilterParams): Promi **Example:** ```typescript -await exchange.fetchTrades("12345", "...") +await exchange.fetchTrades("abc123", "...") ``` **Notes:** @@ -748,12 +774,12 @@ Watch order book updates in real-time via WebSocket. **Signature:** ```typescript -async watchOrderBook(id: string, limit?: number): Promise +async watchOrderBook(outcomeId: string, limit?: number): Promise ``` **Parameters:** -- `id` (string): The Outcome ID to watch +- `outcomeId` (string): The Outcome ID to watch - `limit` (number) - **Optional**: Optional limit for orderbook depth **Returns:** Promise<[OrderBook](#orderbook)> - Promise that resolves with the current orderbook state @@ -761,7 +787,7 @@ async watchOrderBook(id: string, limit?: number): Promise **Example:** ```typescript -await exchange.watchOrderBook("12345", { limit: 10 }) +await exchange.watchOrderBook("abc123", { limit: 10 }) ``` @@ -774,12 +800,12 @@ Watch multiple order books simultaneously via WebSocket. **Signature:** ```typescript -async watchOrderBooks(ids: string[], limit?: number): Promise> +async watchOrderBooks(outcomeIds: string[], limit?: number): Promise> ``` **Parameters:** -- `ids` (string[]): Array of Outcome IDs to watch +- `outcomeIds` (string[]): Array of Outcome IDs to watch - `limit` (number) - **Optional**: Optional limit for orderbook depth **Returns:** Promise> - Promise that resolves with order books keyed by ID @@ -800,19 +826,19 @@ Unsubscribe from a previously watched order book stream. **Signature:** ```typescript -async unwatchOrderBook(id: string): Promise +async unwatchOrderBook(outcomeId: string): Promise ``` **Parameters:** -- `id` (string): The Outcome ID to stop watching +- `outcomeId` (string): The Outcome ID to stop watching **Returns:** Promise - Result **Example:** ```typescript -await exchange.unwatchOrderBook("12345") +await exchange.unwatchOrderBook("abc123") ``` @@ -825,12 +851,12 @@ Watch trade executions in real-time via WebSocket. **Signature:** ```typescript -async watchTrades(id: string, address?: string, since?: number, limit?: number): Promise +async watchTrades(outcomeId: string, address?: string, since?: number, limit?: number): Promise ``` **Parameters:** -- `id` (string): The Outcome ID to watch +- `outcomeId` (string): The Outcome ID to watch - `address` (string) - **Optional**: Public wallet address - `since` (number) - **Optional**: Optional timestamp to filter trades from - `limit` (number) - **Optional**: Optional limit for number of trades @@ -840,7 +866,7 @@ async watchTrades(id: string, address?: string, since?: number, limit?: number): **Example:** ```typescript -await exchange.watchTrades("12345", { address: "0xabc...", since: "..." }) +await exchange.watchTrades("abc123", { address: "0xabc...", since: "..." }) ``` @@ -896,7 +922,7 @@ await exchange.unwatchAddress("0xabc...") --- -### `close` +### `testDummyMethod` Close all WebSocket connections and clean up resources. @@ -904,19 +930,19 @@ Close all WebSocket connections and clean up resources. **Signature:** ```typescript -async close(): Promise +async testDummyMethod(param?: string): Promise ``` **Parameters:** -- None +- `param` (string) - **Optional**: param -**Returns:** Promise - Result +**Returns:** Promise - Result **Example:** ```typescript -await exchange.close() +await exchange.testDummyMethod({ param: "..." }) ``` @@ -1549,10 +1575,12 @@ type: string; // Order type: market (execute immediately) or limit (resting at a price: number; // For limit orders amount: number; // Size in contracts/shares status: string; // Lifecycle status of the order. -filled: number; // Amount filled +filled: number; // Amount filled (USDC cost for buys, shares for sells) +filledShares: number; // Amount filled in shares/contracts (if different from USDC-denominated `filled`). remaining: number; // Amount remaining timestamp: number; // Unix timestamp in milliseconds when the order was created. fee: number; // Fee paid for this order, if known. +feeRateBps: number; // Fee rate in basis points applied to this order (e.g. 100 = 1%). } ``` @@ -1778,6 +1806,8 @@ apiToken: string; // Metaculus: `Authorization: Token ` for higher rat privateKey: string; // Required for Polymarket L1 auth signatureType: any; // 0 = EOA, 1 = Poly Proxy, 2 = Gnosis Safe (Can also use 'eoa', 'polyproxy', 'gnosis_safe') funderAddress: string; // The address funding the trades (defaults to signer address) +walletAddress: string; // +baseUrl: string; // } ``` @@ -1895,6 +1925,7 @@ price?: number; // Required for limit orders fee?: number; // Optional fee rate (e.g., 1000 for 0.1%) tickSize?: number; // Optional override for Limitless/Polymarket negRisk?: boolean; // Optional override to skip neg-risk lookup (Polymarket) +onBehalfOf?: number; // Limitless delegated signing: profile ID to trade on behalf of } ``` @@ -2918,6 +2949,7 @@ Get aggregated builder leaderboard | `GetStructuredTargets` | `GET` | `/structured_targets` | Get Structured Targets | Public | | `GetStructuredTarget` | `GET` | `/structured_targets/{structured_target_id}` | Get Structured Target | Public | | `GetMarketOrderbook` | `GET` | `/markets/{ticker}/orderbook` | Get Market Orderbook | Required | +| `GetMarketOrderbooks` | `GET` | `/markets/orderbooks` | Get Multiple Market Orderbooks | Required | | `GetMilestone` | `GET` | `/milestones/{milestone_id}` | Get Milestone | Public | | `GetMilestones` | `GET` | `/milestones` | Get Milestones | Public | | `GetCommunicationsID` | `GET` | `/communications/id` | Get Communications ID | Required | @@ -3603,6 +3635,16 @@ Get Market Orderbook *(Auth required)* - `` (, string) - `depth` (query, integer) — Depth of the orderbook to retrieve (0 or negative means all levels, 1-100 for specific depth) +--- +##### `GetMarketOrderbooks` + +**GET** `/markets/orderbooks` + +Get Multiple Market Orderbooks *(Auth required)* + +**Parameters:** +- `tickers` (query, array) **required** — List of market tickers to fetch orderbooks for + --- ##### `GetMilestone` diff --git a/sdks/typescript/pmxt/client.ts b/sdks/typescript/pmxt/client.ts index 29a18e42..bbcb17b3 100644 --- a/sdks/typescript/pmxt/client.ts +++ b/sdks/typescript/pmxt/client.ts @@ -779,6 +779,36 @@ export abstract class Exchange { } } + async fetchOrderBooks(ids: string[]): Promise> { + await this.initPromise; + try { + const args: any[] = []; + args.push(ids); + const response = await this.fetchWithRetry(`${this.resolveBaseUrl()}/api/${this.exchangeName}/fetchOrderBooks`, { + method: 'POST', + headers: { 'Content-Type': 'application/json', ...this.getAuthHeaders() }, + body: JSON.stringify({ args, credentials: this.getCredentials() }), + }); + if (!response.ok) { + const body = await response.json().catch(() => ({})); + if (body.error && typeof body.error === "object") { + throw fromServerError(body.error); + } + throw new PmxtError(body.error?.message || response.statusText); + } + const json = await response.json(); + const data = this.handleResponse(json); + const result: Record = {}; + for (const [key, value] of Object.entries(data as any)) { + result[key] = convertOrderBook(value); + } + return result; + } catch (error) { + if (error instanceof PmxtError) throw error; + throw new PmxtError(`Failed to fetchOrderBooks: ${error}`); + } + } + async submitOrder(built: BuiltOrder): Promise { await this.initPromise; try {