Drift
Metaculus exchange constructor uses different credential parameter names in each SDK for the same bearer-token concept. Python uses api_token; TypeScript uses the shared apiKey field from ExchangeOptions.
TypeScript SDK
sdks/typescript/pmxt/client.ts, line 2574 — Metaculus constructor accepts the standard ExchangeOptions interface which provides apiKey:
// sdks/typescript/pmxt/client.ts line 2574
export class Metaculus extends Exchange {
constructor(options: ExchangeOptions = {}) {
super({ ...options, exchange: 'metaculus' });
}
}
ExchangeOptions.apiKey (models.ts line 169) is the field through which an API key credential is passed to all exchanges.
Python SDK
sdks/python/pmxt/_exchanges.py, lines 309–320 — Metaculus constructor accepts a dedicated api_token parameter instead:
# sdks/python/pmxt/_exchanges.py lines 309–320
class Metaculus(Exchange):
def __init__(
self,
api_token: Optional[str] = None,
pmxt_api_key: Optional[str] = None,
base_url: Optional[str] = None,
**kwargs,
):
super().__init__(
exchange="metaculus",
api_token=api_token,
...
)
Exchange.__init__ then maps api_token into _get_credentials_dict and sends it to the sidecar as apiToken (client.py line 263).
Expected
Both SDKs should use the same credential parameter name for Metaculus. If Metaculus requires a bearer token semantically distinct from a generic API key, both SDKs should expose the same parameter name (e.g., both api_token / apiToken, or both api_key / apiKey). The sidecar field name sent over the wire should also be consistent.
Impact
Users migrating between SDKs or reading cross-SDK docs will pass api_key in Python (following the TypeScript pattern) and receive no authentication error — the credential will be silently dropped and requests will fail or be unauthenticated.
Found by automated SDK cross-language drift audit
Drift
Metaculusexchange constructor uses different credential parameter names in each SDK for the same bearer-token concept. Python usesapi_token; TypeScript uses the sharedapiKeyfield fromExchangeOptions.TypeScript SDK
sdks/typescript/pmxt/client.ts, line 2574 —Metaculusconstructor accepts the standardExchangeOptionsinterface which providesapiKey:ExchangeOptions.apiKey(models.ts line 169) is the field through which an API key credential is passed to all exchanges.Python SDK
sdks/python/pmxt/_exchanges.py, lines 309–320 —Metaculusconstructor accepts a dedicatedapi_tokenparameter instead:Exchange.__init__then mapsapi_tokeninto_get_credentials_dictand sends it to the sidecar asapiToken(client.py line 263).Expected
Both SDKs should use the same credential parameter name for Metaculus. If Metaculus requires a bearer token semantically distinct from a generic API key, both SDKs should expose the same parameter name (e.g., both
api_token/apiToken, or bothapi_key/apiKey). The sidecar field name sent over the wire should also be consistent.Impact
Users migrating between SDKs or reading cross-SDK docs will pass
api_keyin Python (following the TypeScript pattern) and receive no authentication error — the credential will be silently dropped and requests will fail or be unauthenticated.Found by automated SDK cross-language drift audit