---
summary: "Invalid BLS_API_KEY is now reported as a configuration error instead of quota_exceeded, and redacted from all error output"
breaking: false
security: true
---

# 0.4.11 — 2026-07-17

## Fixed

- `invalid_api_key` error contract added to `bls_get_series`, `bls_get_latest`, and `bls_list_surveys` (`ConfigurationError`, `retryable: false`) — an invalid `BLS_API_KEY` was previously reported as `quota_exceeded`, pointing operators at a UTC-midnight reset that would never fix a bad key. Recovery hint names `BLS_API_KEY` and links free registration at https://data.bls.gov/registrationEngine/. ([#56](https://github.com/cyanheads/bls-labor-mcp-server/issues/56))
- `BlsApiService.listSurveys` no longer reports a rejected key from `GET /surveys` as generic `service_unavailable` — it now classifies `invalid_api_key` and fails after one request instead of retrying a key that cannot succeed. ([#56](https://github.com/cyanheads/bls-labor-mcp-server/issues/56))
- `bls_get_latest`'s per-series rethrow now recognizes `invalid_api_key` alongside `quota_exceeded`/`series_locked`, so a rejected key surfaces as the tool's own error instead of an entry per series in `failed[]`. ([#56](https://github.com/cyanheads/bls-labor-mcp-server/issues/56))

## Security

- `BlsApiService` redacts the configured `BLS_API_KEY` from every upstream error message it reads — BLS echoes a rejected key back verbatim, and the raw text previously reached client-visible `data.messages` and, via `listSurveys`, the error's own `message` string. ([#56](https://github.com/cyanheads/bls-labor-mcp-server/issues/56))
