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

  1. Set the secret env var named by secret_var (e.g. BITMEX_API_SECRET)
  2. Pass api_secret explicitly alongside api_key
  3. 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

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


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/41c263204239980d. Report an issue: GitHub.