Gap
The Python SDK's primary matching method posts to core's deprecated fetchMatches operation, while the TypeScript SDK correctly uses fetchMarketMatches. The two SDKs' identically-named public methods therefore hit two different core entry points. fetchMatches is not registered in method-verbs.json, so it has no GET route and no entry in the published OpenAPI spec, and every Python match call emits a server-side deprecation warning. It only works at all because the sidecar's POST route dispatches by reflection rather than a registered operation.
Core
core/src/router/Router.ts:502-506:
/** @deprecated Use {@link fetchMarketMatches} instead. */
async fetchMatches(params: FetchMatchesParams): Promise<MatchResult[]> {
logger.warn('fetchMatches is deprecated, use fetchMarketMatches instead');
core/src/server/method-verbs.json has an entry for fetchMarketMatches (verb get) but no fetchMatches key. docs/api-reference/openapi.json exposes /api/router/fetchMarketMatches and /api/router/fetchEventMatches but no /api/router/fetchMatches. The deprecated method only resolves via reflection at core/src/server/app.ts:453 (if (typeof exchange[methodName] !== "function")).
TypeScript SDK
Correct — sdks/typescript/pmxt/router.ts:276: await this.sidecarReadRequest('fetchMarketMatches', query, [query]).
Python SDK
sdks/python/pmxt/router.py:207: raw = self._call_method("fetchMatches", params) — inside fetch_market_matches (line 153), meaning the non-deprecated Python method name is permanently wired to core's deprecated method. The already-deprecated fetch_matches (line 232) also delegates to the same code path. _call_method builds POST {host}/api/{exchange}/{method} at client.py:1205.
Evidence
Core marks fetchMatches @deprecated and logs a warning on every call (Router.ts:502-506); it has no registered verb in method-verbs.json and no OpenAPI operation, unlike fetchMarketMatches. Python's router.py:207 calls self._call_method("fetchMatches", params) from inside its supposedly-current fetch_market_matches.
Impact
Python's non-deprecated call path is permanently pinned to a deprecated core method: no GET/idempotent-read route exists for it, it has no OpenAPI operation (so any gateway or proxy that allowlists documented operations rejects it), it logs a spurious deprecation warning on every legitimate call, and it will break outright when core eventually removes fetchMatches. Not covered by #1818 (surfacing deprecation to users) or #1331 (typed overloads) — this is a wrong dispatch target, not a missing type or missing warning surface.
Found by automated Core-to-SDK surface coverage audit
Gap
The Python SDK's primary matching method posts to core's deprecated
fetchMatchesoperation, while the TypeScript SDK correctly usesfetchMarketMatches. The two SDKs' identically-named public methods therefore hit two different core entry points.fetchMatchesis not registered inmethod-verbs.json, so it has no GET route and no entry in the published OpenAPI spec, and every Python match call emits a server-side deprecation warning. It only works at all because the sidecar's POST route dispatches by reflection rather than a registered operation.Core
core/src/router/Router.ts:502-506:core/src/server/method-verbs.jsonhas an entry forfetchMarketMatches(verbget) but nofetchMatcheskey.docs/api-reference/openapi.jsonexposes/api/router/fetchMarketMatchesand/api/router/fetchEventMatchesbut no/api/router/fetchMatches. The deprecated method only resolves via reflection atcore/src/server/app.ts:453(if (typeof exchange[methodName] !== "function")).TypeScript SDK
Correct —
sdks/typescript/pmxt/router.ts:276:await this.sidecarReadRequest('fetchMarketMatches', query, [query]).Python SDK
sdks/python/pmxt/router.py:207:raw = self._call_method("fetchMatches", params)— insidefetch_market_matches(line 153), meaning the non-deprecated Python method name is permanently wired to core's deprecated method. The already-deprecatedfetch_matches(line 232) also delegates to the same code path._call_methodbuildsPOST {host}/api/{exchange}/{method}atclient.py:1205.Evidence
Core marks
fetchMatches@deprecatedand logs a warning on every call (Router.ts:502-506); it has no registered verb inmethod-verbs.jsonand no OpenAPI operation, unlikefetchMarketMatches. Python'srouter.py:207callsself._call_method("fetchMatches", params)from inside its supposedly-currentfetch_market_matches.Impact
Python's non-deprecated call path is permanently pinned to a deprecated core method: no GET/idempotent-read route exists for it, it has no OpenAPI operation (so any gateway or proxy that allowlists documented operations rejects it), it logs a spurious deprecation warning on every legitimate call, and it will break outright when core eventually removes
fetchMatches. Not covered by #1818 (surfacing deprecation to users) or #1331 (typed overloads) — this is a wrong dispatch target, not a missing type or missing warning surface.Found by automated Core-to-SDK surface coverage audit