> This page is for SDK, 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.

# Changelog

## October 12, 2026

## 0.37.1

**`(fix):`** Fix snippets and wire tests for APIs with multiple base URLs leaving out the `baseURL`
argument the client initializer requires, so they failed to compile. A custom base URL is now
passed through. Otherwise the snippet uses the first base URL of the requested (or default)
environment.

## October 5, 2026

## 0.37.0

**`(feat):`** The `additionalBodyParameters` request option (`[String: String]`) is now applied to requests;
previously it was accepted but ignored. Add a new `additionalBodyProperties` request option
(`[String: JSONValue]`) for sending non-string JSON values (booleans, numbers, arrays, objects,
and `null`). Both are merged into the serialized JSON request body using wire-format keys,
override generated fields on collision, and create a JSON body when the endpoint has none
(except GET and HEAD requests, which are still sent without a body);
`additionalBodyProperties` wins when both set the same key. Multipart and raw `Data` bodies are
left unchanged. `JSONValue` now supports string, integer, float, boolean, array, and dictionary
literals.

## September 29, 2026

## 0.36.4

**`(chore):`** Bump bundled @fern-api/generator-cli to 0.10.3. When the hosted auto-version analysis of the
full SDK diff fails, generator-cli now retries chunk-by-chunk instead of silently applying a
PATCH bump; any remaining unavailable or incomplete analysis adds a "Version bump not verified"
notice to the SDK PR body and disables automerge.

## September 22, 2026

## 0.36.3

**`(chore):`** Bump bundled @fern-api/generator-cli to 0.10.1. Auto-versioned MAJOR/MINOR bumps no longer
produce a version-only `changelog.md` block when the AI analysis returns an empty changelog
entry; the PR description, version bump reason, or commit message body is used instead.

## 0.36.2

**`(fix):`** Honor the org-level whitelabel setting (`readmeConfig.whiteLabel`) and the `apiName`/`disabledSections` (IR `disabledFeatures`) readme
config options when generating README.md. Previously the "Built with Fern" badge was always emitted.

## August 20, 2026

## 0.36.1

**`(fix):`** Endpoints configured with `x-fern-retries: { disabled: true }` (or `retries: { disabled: true }` in a Fern
definition) are no longer retried. The generated endpoint method passes `retriesDisabled: true` to the
HTTP client, which takes precedence over both the client-level `maxRetries` and the per-request
`RequestOptions.maxRetries`.

## July 20, 2026

## 0.36.0

**`(feat):`** Endpoint methods now include a usage code example in their doc comments,
so IDEs like Xcode surface a ready-to-use snippet in Quick Help on hover.

## June 22, 2026

## 0.35.17

**`(fix):`** Fix generated code for `set`-typed request bodies and response values. The
Swift SDK represents `set` as `JSONValue`, so set example values now render
as `JSONValue` literals (e.g. `JSONValue.array([...])`) in snippets and wire
tests instead of being dropped or emitted as untyped Swift array literals.

**`(fix):`** Fix wire tests for endpoints that return an enum. The expected-response value
is now referenced through its enum type (e.g. `WeatherReport.sunny`) rather
than via shorthand (`.sunny`), which has no contextual type to resolve
against when the response itself is an enum.

**`(fix):`** Fix JSON encoding/decoding of maps keyed by a non-`String` type (e.g. a
string enum or an undiscriminated union). Swift only serializes a
`Dictionary` as a JSON object when its key is `String`/`Int` or conforms to
`CodingKeyRepresentable`; otherwise it falls back to a JSON array, which
fails to round-trip object payloads. The generator now emits a
`CodingKeyRepresentable` conformance for enum and undiscriminated-union types
used as map keys. The conformance is gated with `@available` (macOS 12.3+,
iOS 15.4+, tvOS 15.4+, watchOS 8.5+) to match the platforms where
`Dictionary`'s `Codable` conformance uses `CodingKeyRepresentable`, so the
generated SDK keeps compiling on its existing deployment targets.

**`(fix):`** Fix generated code and snippets for `allow-multiple` query parameters. These
parameters are now typed as arrays in endpoint method signatures (e.g.
`[String]`, `[Nullable<String>]`) and their example values render as arrays,
so the generated SDK, snippets, and wire tests compile correctly.

**`(fix):`** Fix `bigint` values rendering as empty in dynamic snippets. They are now
emitted as string literals, matching the `String` type used for bigints.

## June 18, 2026

## 0.35.16

**`(fix):`** Fix generated snippets and wire tests omitting path parameters bound to
API-level variables. Path parameters are always required arguments on the
generated endpoint method, so a placeholder value (e.g. `<endpointParam>`) is
now emitted for any path parameter whose value is absent from the example,
keeping the generated SDK, snippets, and wire tests compiling.

## 0.35.15

**`(fix):`** Fix endpoints with a stream-parameter response generating a `JSONValue` return
type, which broke generated wire tests that compared the result against the
concrete response model. The Swift SDK does not yet implement response
streaming, so these endpoints are now generated against their non-streaming
response shape (e.g. the declared JSON response model).

## June 17, 2026

## 0.35.14

**`(fix):`** Fully qualify `Foundation.Data` in the generated HTTP client and test
templates. When an API defined a type named `Data`, the generated
top-level `Data` type shadowed `Foundation.Data` in those templates, so the
request-body builder and stub helpers resolved to the wrong type and failed
to compile. The remaining bare `Data` references now use `Foundation.Data`,
matching the convention already used elsewhere in the runtime.

**`(fix):`** Default an optional referenced request body to `nil` in the generated client
method, and omit the `request` argument from snippets and wire tests when an
example provides no body. Previously the parameter had no default value while
snippets emitted an empty initializer for the wrapped type, so endpoints with
an absent optional request body failed to compile.

## June 16, 2026

## 0.35.13

**`(fix):`** Fixed argument ordering in generated wire tests and snippets so they match
the order in which the corresponding Swift types declare their memberwise
initializer parameters. Example object properties were previously emitted in
the example's authoring order, and file-upload fields were grouped by kind
(files before body properties), both of which could produce arguments in the
wrong positional order and fail to compile. Wire-test response objects are
now reordered to match the generated struct's declaration order, and
file-upload request snippets preserve the original schema declaration order.

**`(fix):`** Fixed inline literal query parameters so they are typed correctly in the
generated client method instead of falling back to the placeholder
`JSONValue`. A boolean literal now maps to `Bool` and a string literal maps
to a dedicated literal enum nested on the owning client. Previously the
parameter was typed as `JSONValue` while the generated snippets and wire
tests emitted the literal enum case, causing a type mismatch that failed to
compile.

**`(fix):`** Fixed endpoints that return a `text/plain` response so the generated method
returns `String` instead of the placeholder `JSONValue`. The HTTP client
already decodes a `String` response type from the raw UTF-8 body, so the
generated wire tests now compile and pass (previously `response == "string"`
failed because the response was typed as `JSONValue`).

**`(fix):`** Fixed generated snippets and wire tests for single-property discriminated
union variants. The wrapped value is serialized under the variant's property
wire key (the union's CodingKeys raw value), but the snippet/wire-test
generator was reading it from the discriminant's wire name, so variants whose
discriminant differed from that key (e.g. a `date` or `datetime` case) emitted
an empty enum case like `UnionWithTime.date()` that failed to compile. The
value is now read from the correct property key, including variants that
customize it via `key:`.

**`(fix):`** Preserve the declaration order of undiscriminated union members in generated
code. Members were previously sorted alphabetically, which reordered the
decoding attempts emitted in the `Decodable` initializer. For a union
containing both `int` and `double`, this tried `Double` before `Int` and
decoded integral JSON numbers (e.g. `1`) as a `Double` (`1.0`), so wire tests
failed to round-trip. Members are now decoded in declaration order, matching
Fern's undiscriminated union semantics.

**`(fix):`** Fixed generated wire tests to include extra (additional) properties in the
expected response object for types whose schema permits them. The decoded
response captures any undeclared JSON keys into `additionalProperties`, but
the expected response object previously omitted them, so the equality
assertion failed. Plain object responses now populate `additionalProperties`
the same way undiscriminated-union responses already did.

**`(fix):`** Fixed generated wire tests and snippets so that they pass endpoint header
arguments to the endpoint method. The endpoint method call previously emitted
only path, query, and body arguments, omitting required header parameters
(e.g. `X-API-Version`), which produced calls missing required arguments that
failed to compile. Headers are now rendered between the path and query
arguments to match the generated method signature, filtered to the
String-typed headers the SDK surfaces as parameters. The String-type filter
resolves through type aliases, so a header typed as an alias of String is
emitted just like the SDK declares it.

## 0.35.12

**`(fix):`** Fixed wire-test stub response bodies so they are valid JSON for every
response type. The generated SDK reads `String`-typed response bodies as raw
UTF-8 but decodes every other type via `JSONDecoder`. Wire tests now mirror
that: `String`-decoded responses (string/bigInteger/base64 primitives) emit
the raw payload, while all other types (objects, enums, dates, UUIDs, numbers,
unions, etc.) are JSON-encoded. Previously bare scalars such as a UUID or enum
value were emitted unquoted, producing invalid JSON that failed to decode.

## June 15, 2026

## 0.35.11

**`(fix):`** Fixed several Swift code generation bugs around identifier and string escaping:

* Enum raw values are now escaped as raw Swift string content rather than being
  JSON-encoded, fixing invalid literals (e.g. unterminated strings and bogus escapes).
* Reserved keywords used as type names, enum/case names, property names, and type
  references are now backtick-escaped (e.g. `Type`), and identifiers that start with
  a digit are sanitized (e.g. `3D` -> `_3D`).
* String-typed literals that are not registered as nested literal enums (such as
  endpoint header/query literals) now fall back to `JSONValue` instead of crashing
  generation.

## June 9, 2026

## 0.35.10

**`(fix):`** Fix enum query parameters wrapped in `Nullable<>` to emit .rawValue for proper
Swift compilation. Previously, nullable enum query params generated .string($0)
instead of .string($0.rawValue), causing type errors.

## May 22, 2026

## 0.35.9

**`(chore):`** Bump Node.js base image from 24.15 to 24.16.

## May 15, 2026

## 0.35.8

**`(fix):`** Dynamic snippets now render path-parameter arguments in IR (URL / SDK signature) order
rather than in the order they happen to appear in the input request, so generated
examples line up with the actual SDK method signature even when the spec lists path
parameters in a different order.

## May 14, 2026

## 0.35.7

**`(chore):`** Patch the bundled `ip-address` to v10.2.0 in the swift-sdk container to
address CVE-2026-42338 / GHSA-v2v4-37r5-5v8g (XSS in `Address6` HTML-
emitting methods). npm 11.12.1 (shipped with `node:24.15`) bundles
`ip-address@10.1.0` via `socks`; this overlays the published 10.2.0
tarball in place at image build time.

## May 12, 2026

## 0.35.6

**`(chore):`** Patch Swift SDK + Swift model generator container CVEs flagged in the AWS
ECR / grype scan. Patch npm's bundled `picomatch@4.0.3 -> 4.0.4` and
`brace-expansion@5.0.4 -> 5.0.5` via tarball replacement so the published
image no longer ships the vulnerable bundled JS dependencies that grype
flags.

## May 11, 2026

## 0.35.5

**`(chore):`** Bump the Swift SDK and Swift model generator containers' Node base image
from `node:22.22-alpine3.23` to `node:24.15-alpine3.23`. Aligns the
generators with the rest of the Fern generator containers on a single Node
major version (Node 24) and picks up Node 24's CVE patches.

## May 7, 2026

## 0.35.4

**`(chore):`** Bump generator container Node.js base image to `node:22.22-alpine3.23` and
apply latest Alpine package security updates at build time.

## May 6, 2026

## 0.35.3

**`(fix):`** Fix Swift wire-test runtime equality failures when a response body contains
a map (`Dictionary<String, T>`) whose value is an explicit-null nullable, or
an `Optional<Nullable<T>>` field whose example is explicit-null. Previously
the generator embedded the IR's `jsonExample` for the response body, which
silently dropped keys whose value resolved to JS `undefined` (e.g. an
unresolved `nullable<T>`), and the expected-struct generator filtered
optional properties using the same `jsonExample === undefined` check, which
matched both "truly absent" and "explicit-null nullable" examples. The wire-
test JSON body is now built by walking the typed example shape directly,
and the expected-struct generator skips a property only when the typed
`optional` container is genuinely empty — so an explicit-null nullable
inside an optional now renders as `Optional(.null)` in both the embedded
JSON body and the expected struct.

## 0.35.2

**`(chore):`** Update the Swift SDK generator container base image from
`node:22.12-alpine3.20` to `node:22.22-alpine3.22` to address 92
container vulnerabilities (3 Critical, 48 High, 30 Medium, 11 Low)
reported by Grype. The bump pulls in newer Alpine packages
(libcrypto3/libssl3, musl, busybox, zlib), Node.js 22.22.x, and the
bundled npm transitive dependencies (cross-spawn, minimatch, glob,
tar, brace-expansion, ip-address, diff).

## May 5, 2026

## 0.35.1

**`(fix):`** Apply canonical "all user-specified examples, else first autogenerated" selection
in the Swift SDK snippet output path. README examples now use the user-specified
example value (when one exists) instead of the autogenerated placeholder, matching
TS-v1 / Python-v1 behavior.

## 0.35.0

**`(feat):`** Generate CONTRIBUTING.md for Swift SDKs.

_Showing the 20 most recent of 76 entries. Append `/llms.txt` to the changelog URL for the complete index._