> This page is for SDKs.

> For clean Markdown content of this page, append .md to this URL. For the complete documentation index, see https://buildwithfern.com/learn/llms.txt.

## 0.30.2

**`(fix):`** Fix dynamic snippet generation for bytes endpoints with query parameters
to use the request struct instead of positional arguments.

## 0.30.1

**`(fix):`** Generate request structs for bytes (octet-stream) endpoints with query
parameters, replacing positional arguments with a single struct that
bundles the raw body and all query params with a builder pattern.

## 0.30.0

**`(feat):`** Overhaul WebSocket reconnection: exponential backoff with jitter, auto-reset
of retry counter after 5s of stable connection, and message queuing during
reconnect (text and binary messages are buffered and flushed after reconnection
instead of erroring).

**`(feat):`** Add `DisconnectInfo` struct to `WebSocketMessage::Close`, exposing the close
code and reason string from the server. `recv()` now returns `None` on close
frames to signal end-of-stream.

**`(feat):`** Generate typed `ConnectOptions` structs for WebSocket channels with query
parameters, replacing positional `&str` arguments with a `#[derive(Default)]`
struct that supports `..Default::default()` ergonomics. Uses `QueryBuilder`
under the hood, matching the HTTP endpoint pattern.

**`(feat):`** Support custom connect and message method names from the IR
(`channel.connectMethodName`, `msg.methodName`), falling back to `connect`
and `send_{name}` respectively.

**`(feat):`** Add `generateWebSocketClients` config alias alongside `enableWebsockets`,
matching the TypeScript/Python/Java generator config key.

**`(feat):`** Route each WebSocket connector through the correct environment URL method
in multi-URL APIs (e.g., Deepgram's `wss://agent.deepgram.com` vs
`wss://api.deepgram.com`).

**`(feat):`** Add `Unknown(serde_json::Value)` catch-all variant to generated
`ServerMessage` enums for forward compatibility with new server message types.

**`(feat):`** Graceful WebSocket close: sends Close frame and waits up to 5s for the
server's response, with double-close guard.

**`(fix):`** Change implicit auth parameter from required `&str` to `Option<&str>`,
conditionally injecting the Authorization header only when a token is provided.

**`(fix):`** Fix connector auth forwarding for APIs with explicit Authorization headers
(e.g., Deepgram) — the connector now correctly unwraps the `Option` to match
the client's `&str` parameter type.

**`(fix):`** Fix `recv()` on JSON-only channels to return an error with frame size on
unexpected binary frames instead of silently skipping them.

**`(chore):`** Derive channel names from the channel path instead of the channel ID, moving
version segments to suffix position (e.g., `/v1/agent/converse` →
`AgentConverseV1Client`).

**`(fix):`** Replace `#[serde(untagged)]` derive on `ServerMessage` enums with a custom
`Deserialize` impl that uses round-trip scoring. Fixes silent mismatches
where `#[serde(default)]` on struct fields caused every variant to match,
always returning the first.

**`(chore):`** Introduce `ReconnectContext` struct to group reconnection state, replacing
8 separate `Arc`-wrapped parameters in `read_loop` and `try_reconnect`.

**`(fix):`** Fix `try_reconnect` to retry with exponential backoff up to
`max_reconnect_attempts`, instead of giving up after a single failed attempt.

**`(fix):`** Fix `flush_queues` to preserve messages on send failure by cloning before
sending and pushing back to the front of the queue on error.

**`(chore):`** Remove dead `parse_websocket_message` function and unused
`serde::de::DeserializeOwned` import from WebSocket client infrastructure.

**`(fix):`** Fix wire test generator to set `config.environment = None` for multi-URL
APIs so requests route to the WireMock server instead of real API endpoints.

**`(fix):`** Fix `number_serializers` unit test assertion to use `1e+20` matching Rust's
serde\_json exponent formatting.

**`(fix):`** Fix WebSocket connectors to support `api_key` auth in addition to bearer
token. The connector now receives a pre-computed Authorization header value
from the root client, using the IR's api key prefix (e.g., `Token`) with
`api_key` taking priority over `token`, matching the HTTP client's behavior.

### What's new

* This is a breaking change for any code that previously passed query
  parameters as positional arguments to `connect()`.

## 0.29.0

**`(feat):`** Add per-endpoint URL resolution for multi-URL environments. Each endpoint
now resolves its base URL at call time from the environment object, matching
the Python and Java SDK approach.

**`(feat):`** Generate `ApiClientBuilder` from code instead of a static template, enabling
environment-aware builder methods for multi-URL APIs.

**`(feat):`** Add per-base-URL getter methods on the `Environment` enum (e.g.,
`api_url()`, `agent_url()`) for multi-URL environments.

**`(feat):`** Add `Option<Environment>` field to `ClientConfig` for multi-URL environments
to support per-endpoint URL resolution.

**`(feat):`** Add `base_url()`, `config()`, `execute_request_with_base_url()`, and
`execute_stream_request_with_base_url()` accessors to `HttpClient` for
multi-URL endpoint resolution.

**`(chore):`** Remove construction-time URL override from `RootClientGenerator`; all
sub-clients now receive `config.clone()` uniformly.

## 0.28.0

**`(feat):`** Add `number_serializers` module that serializes whole-number `f64` values
without trailing `.0` (e.g., `24000.0` serializes as `24000`). Some APIs
reject the decimal representation for integer-valued numbers. Includes
range validation to prevent incorrect values for numbers outside `i64` range.

**`(feat):`** Add `execute_bytes_request` HTTP client method for endpoints with
`application/octet-stream` request bodies, sending raw bytes instead of
JSON-encoding them.

**`(feat):`** Support API key prefix from IR auth schemes. When a prefix like `Token`
or `Bearer` is configured, the generated HTTP client prepends it to the
API key header value.

**`(fix):`** Refactor query parameters on file-upload and inlined request bodies to be
sent as URL query strings instead of being serialized into the request body.
Query param fields are now marked with `#[serde(skip_serializing)]`.

**`(fix):`** Fix redundant `#[serde(skip_serializing_if = "Option::is_none")]` and
`#[serde(skip_serializing)]` on optional query param fields. Only
`skip_serializing` is now emitted.

**`(chore):`** Conditionally include `number_serializers.rs` only when the IR uses
float/double types, consistent with other serializer modules.

**`(chore):`** Replace unsafe type cast on auth schemes with proper
`FernIr.AuthScheme._visit()` pattern matching.

**`(chore):`** Upgrade IR SDK from v61 to v65.