nautechsystems/nautilus_trader · error · anyhow::Error
{secret_var} is required when {key_var} is provided
Error message
{secret_var} is required when {key_var} is provided What it means
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.
Source
Thrown at crates/adapters/bitmex/src/http/client.rs:1040
max_requests_per_second: u32,
max_requests_per_minute: u32,
proxy_url: Option<String>,
) -> anyhow::Result<Self> {
// Determine environment from URL to select correct environment variables
let environment = if base_url.as_ref().is_some_and(|url| url.contains("testnet")) {
BitmexEnvironment::Testnet
} else {
BitmexEnvironment::Mainnet
};
let (key_var, secret_var) = credential_env_vars(environment);
let api_key = get_or_env_var_opt(api_key, key_var);
let api_secret = get_or_env_var_opt(api_secret, secret_var);
// If we're trying to create an authenticated client, we need both key and secret
if api_key.is_some() && api_secret.is_none() {
anyhow::bail!("{secret_var} is required when {key_var} is provided");
}
if api_key.is_none() && api_secret.is_some() {
anyhow::bail!("{key_var} is required when {secret_var} is provided");
}
Self::new(
base_url,
api_key,
api_secret,
environment,
timeout_secs,
max_retries,
retry_delay_ms,
retry_delay_max_ms,
recv_window_ms,
max_requests_per_second,
max_requests_per_minute,View on GitHub (pinned to 18893faf8b)
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
Example fix
// before export BITMEX_API_KEY=abc # after export BITMEX_API_KEY=abc export BITMEX_API_SECRET=xyz
Defensive patterns
Strategy: validation
Validate before calling
let has_key = api_key.is_some() || std::env::var("BITMEX_API_KEY").is_ok();
let has_secret = api_secret.is_some() || std::env::var("BITMEX_API_SECRET").is_ok();
if has_key && !has_secret { panic!("BITMEX_API_SECRET missing"); } Try / catch
match client_result {
Ok(c) => c,
Err(e) if e.to_string().contains("is required when") => configure_missing_secret(),
Err(e) => return Err(e),
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- {key_var} is required when {secret_var} is provided
- Both `api_key` and `api_secret` must be provided together
- Redis config error: username supplied without password. Eith
- API credentials not configured
- Missing environment variable: {key_env}
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/41c263204239980d.
Report an issue: GitHub.