{"record":{"id":"4f81e6c72bd38111","repo":"nautechsystems/nautilus_trader","slug":"key-var-is-required-when-secret-var-is-provide","errorCode":null,"errorMessage":"{key_var} is required when {secret_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":1044,"sourceCode":"        // 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,\n            proxy_url,\n        )\n        .map_err(|e| anyhow::anyhow!(\"Failed to create HTTP client: {e}\"))\n    }","sourceCodeStart":1026,"sourceCodeEnd":1062,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/bitmex/src/http/client.rs#L1026-L1062","documentation":"Credential pairing check in with_credentials: authenticating requires both an API key and secret. When only one of the environment-derived credential variables (key_var/secret_var, e.g. the API key variable without its secret counterpart) is present, client construction aborts.","triggerScenarios":"Calling with_credentials with api_key=None (and key_var env var unset) while api_secret is Some or the secret_var env var is set.","commonSituations":"Setting only the secret env var and forgetting the key; deleting/renaming the key env var during a config change; passing None for api_key while supplying the secret argument.","solutions":["Set the key env var named by key_var (e.g. BITMEX_API_KEY)","Pass api_key explicitly alongside api_secret","Check credential plumbing so key and secret are sourced from the same config"],"exampleFix":"// before\nexport BITMEX_API_SECRET=xyz\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_secret && !has_key { panic!(\"BITMEX_API_KEY missing\"); }","typeGuard":null,"tryCatchPattern":"match client_result {\n    Ok(c) => c,\n    Err(e) if e.to_string().contains(\"is required when\") => configure_missing_key(),\n    Err(e) => return Err(e),\n}","preventionTips":["Provision key and secret from one config source","Verify env var names in deployment manifests","Fail fast at startup by building the client eagerly"],"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"}