{"record":{"id":"41c263204239980d","repo":"nautechsystems/nautilus_trader","slug":"secret-var-is-required-when-key-var-is-provide","errorCode":null,"errorMessage":"{secret_var} is required when {key_var} is provided","messagePattern":"(.+?) is required when (.+?) is provided","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/bitmex/src/http/client.rs","lineNumber":1040,"sourceCode":"        max_requests_per_second: u32,\n        max_requests_per_minute: u32,\n        proxy_url: Option<String>,\n    ) -> anyhow::Result<Self> {\n        // Determine environment from URL to select correct environment variables\n        let environment = if base_url.as_ref().is_some_and(|url| url.contains(\"testnet\")) {\n            BitmexEnvironment::Testnet\n        } else {\n            BitmexEnvironment::Mainnet\n        };\n\n        let (key_var, secret_var) = credential_env_vars(environment);\n\n        let api_key = get_or_env_var_opt(api_key, key_var);\n        let api_secret = get_or_env_var_opt(api_secret, secret_var);\n\n        // If we're trying to create an authenticated client, we need both key and secret\n        if api_key.is_some() && api_secret.is_none() {\n            anyhow::bail!(\"{secret_var} is required when {key_var} is provided\");\n        }\n\n        if api_key.is_none() && api_secret.is_some() {\n            anyhow::bail!(\"{key_var} is required when {secret_var} is provided\");\n        }\n\n        Self::new(\n            base_url,\n            api_key,\n            api_secret,\n            environment,\n            timeout_secs,\n            max_retries,\n            retry_delay_ms,\n            retry_delay_max_ms,\n            recv_window_ms,\n            max_requests_per_second,\n            max_requests_per_minute,","sourceCodeStart":1022,"sourceCodeEnd":1058,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/bitmex/src/http/client.rs#L1022-L1058","documentation":"BitmexHttpClient::with_credentials requires API key and secret to be supplied together. If a key is present but the secret is missing (neither argument nor environment variable), the client refuses to build an authenticated client.","triggerScenarios":"Calling with_credentials(base_url, Some(key) or key_var set, None secret, key_var, secret_var) where get_or_env_var_opt resolves the key but yields no secret.","commonSituations":"Setting only BITMEX_API_KEY in the environment and forgetting BITMEX_API_SECRET; passing the secret argument as None while providing the key explicitly; typo in the secret env var name.","solutions":["Set the secret env var named by secret_var (e.g. BITMEX_API_SECRET)","Pass api_secret explicitly alongside api_key","Verify the env var names passed for key_var/secret_var are not swapped or misspelled"],"exampleFix":"// before\nexport BITMEX_API_KEY=abc\n# after\nexport BITMEX_API_KEY=abc\nexport BITMEX_API_SECRET=xyz","handlingStrategy":"validation","validationCode":"let has_key = api_key.is_some() || std::env::var(\"BITMEX_API_KEY\").is_ok();\nlet has_secret = api_secret.is_some() || std::env::var(\"BITMEX_API_SECRET\").is_ok();\nif has_key && !has_secret { panic!(\"BITMEX_API_SECRET missing\"); }","typeGuard":null,"tryCatchPattern":"match client_result {\n    Ok(c) => c,\n    Err(e) if e.to_string().contains(\"is required when\") => configure_missing_secret(),\n    Err(e) => return Err(e),\n}","preventionTips":["Set both BITMEX_API_KEY and BITMEX_API_SECRET together","Check env vars at startup with a config sanity check","Avoid sourcing key and secret from different mechanisms"],"tags":["rust","bitmex","credentials","configuration"],"backgroundTag":"missing-credentials","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}