> This page is for SDKs, version Legacy.
> For other versions, use one of these documentation indexes:
> - Current (default): https://buildwithfern.com/learn/sdks/current/llms.txt
> - Legacy: https://buildwithfern.com/learn/sdks/legacy/llms.txt

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

## 5.24.0

**`(feat):`** Add an opt-in `optional-auth` config flag. When enabled, client auth
parameters (bearer token, basic auth username/password, header auth) are
made optional even when the API spec mandates auth on all endpoints
(`isAuthMandatory=true`). Auth headers are only sent when credentials are
provided. Useful for hand-maintained wrapper clients that authenticate via
external means (e.g. cloud provider credentials). Defaults to `false`, so
existing behavior is unchanged.

## 5.23.0

**`(feat):`** Add an opt-in `runtime_version` config flag. When enabled, the SDK version
reported in the telemetry headers (`X-Fern-SDK-Version` and the version segment
of `User-Agent`) is resolved at runtime via `importlib.metadata.version(<dist>)`
instead of being baked in as a literal at generation time. This lets the reported
version track the actually-installed package version — for example when an
external tool such as release-please sets the published version after generation —
rather than a version the SDK may never publish. Falls back to the generation-time
version when the distribution is not installed (e.g. running from source). Disabled
by default, so existing generated output is unchanged, and subject to
`omit_fern_headers`.

## 5.22.2

**`(fix):`** Fix multipart form list-of-primitive body properties being sent as a single
JSON-encoded field instead of repeated form fields. A property such as
`Optional[List[str]]` was serialized as `json.dumps(jsonable_encoder(value))`,
producing one field whose value was the whole JSON array (e.g.
`keyterms=["a","b"]`); servers that validate each item then rejected it. Such
properties are now passed through `jsonable_encoder` and handed directly to
httpx's `data=`, emitting repeated fields (`keyterms=a`, `keyterms=b`). Lists of
objects, maps, and other complex types remain JSON-encoded as before.