> 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

## September 28, 2026

## 5.140.0

**`(feat):`** Support generating from a composed workspace. A workspace that declares no specs of its own and
composes sibling workspaces through dependencies.yml now exposes those dependencies' specs,
namespaced by the directory of the package marker that exports them, so it can produce a source
archive instead of failing with "workspace type fern does not expose source specs".

## 5.139.4

**`(fix):`** `fern export` now emits `anyOf` (instead of `oneOf`) for undiscriminated unions. Undiscriminated
union members can overlap (e.g. a set of string literals alongside `string`), so `oneOf` caused
strict JSON Schema validators to reject values that matched more than one member.

## 5.139.3

**`(fix):`** Allow replay to be enabled for SDK generators routed through sdk-gen-api.
Previously, generators with both sdkGenApiRoute and replay.enabled: true failed
with a configuration error.

## 5.139.2

**`(fix):`** `fern generate --docs` now fails when a rule configured as `error` in `docs.yml` `check.rules`
(e.g. `broken-links: error`) reports a violation, matching the behavior of `fern check`.
Previously the violation was logged but docs were still published.

## 5.139.1

**`(fix):`** Propagate AsyncAPI message `description`/`summary` to WebSocket channel message docs so they appear in the API reference and generated SDK docstrings. Previously only the payload schema's description survived import.

## September 25, 2026

## 5.139.0

**`(feat):`** The OpenAPI importer now honors `x-twilio.libraryVisibility` (`public` | `private` | `hidden`) during SDK
generation. Visibility is read from the operation, path item, or `info` object (most specific wins), and from
parameters, schemas, and object properties. `fern generate` keeps only `public` elements; the new
`fern generate --private` flag also keeps `private` elements. `hidden` elements are never generated.
Other commands (`fern check`, `fern generate-ir`) are unaffected.

**`(feat):`** Docs generation now honors `x-twilio.docsVisibility` (`public` | `private` | `hidden`) with the same
resolution rules, independently of `libraryVisibility`. `fern generate --docs` and `fern docs dev` publish
only `public` elements in API references; `--private` also includes `private` elements. `hidden` elements
never appear in docs.

## 5.138.1

**`(chore):`** Add a pre-prod CLI build target that uses Postman-hosted production sdk-gen service origins
(sdk-gen.postman.co and related service domains) ahead of DNS cutover.

## 5.138.0

**`(feat):`** Add `theme.site-switcher` to docs.yml and global themes. When enabled, docs sites
published to the same domain under different basepaths are listed in a header
site switcher; `order`, `hide`, `labels`, and `show-products` control presentation.

## September 24, 2026

## 5.137.2

**`(fix):`** Preserve API import settings that affect documentation when `fern sdk migrate` decouples docs.yml from generators.yml.

## 5.137.1

**`(fix):`** An explicitly empty array in an OpenAPI overrides file (e.g. `security: []` to opt an
endpoint out of global auth) now replaces the original array instead of being ignored.

## 5.137.0

**`(feat):`** Add `api.settings.webhook-signature` to `generators.yml`. Declares an API-wide webhook
signature scheme (same shape as a webhook `signature` block) once, outside the API
definition, and compiles it into `sdkConfig.webhookSignatureVerification` in the IR so
every SDK generator emits the shared webhook verification helper without any webhooks or
`x-fern-*` extensions in the spec.

## 5.136.0

**`(feat):`** Support secure SDK Config v1 direct publishing to npm, Maven, PyPI, and crates.io through sdk-gen-api.

## 5.135.1

**`(fix):`** Hosted MCP deploys now fail fast, before uploading anything, when a generated tool name is longer than 64 characters or contains disallowed characters, and suggest an `x-fern-mcp-name` overlay for the operation (method + path). Deploy errors from the registry now include each validation issue instead of only the headline message.

## 5.135.0

**`(feat):`** Add `fern docs theme download --name <name> [--org <org>] [--output <dir>]`, which fetches an
org-level theme from Fern's cloud and writes it as a local theme directory (theme.yml plus its
logo/font/css/js assets with relative paths). The inverse of `fern docs theme upload`; useful for
vendoring a theme into a self-hosted docs image so `global-theme` resolves without network access.

## 5.134.3

**`(fix):`** Docs validation no longer logs a "Slow file read" debug line for every markdown page when many
files are read concurrently (the timing included threadpool queue time, not disk speed). It now
logs one summary per validation run and only flags reads that are outliers relative to the batch.

**`(fix):`** The CLI now defaults `UV_THREADPOOL_SIZE` to 8 (from Node's default of 4) so concurrent file
reads spend less time queued behind the libuv threadpool. Set the variable explicitly to override.

**`(fix):`** The OpenAPI importer no longer drops the `properties` of a schema whose sibling
`oneOf` only lists which of those properties must be present (for example
`oneOf: [{ required: [domain] }, { required: [phone] }]`). Such a `oneOf` is an
"exactly one of" constraint over the declared object, not a set of variants, so
the schema is now converted as an object with every declared property preserved.
This also applies when the schema is an inline member of an `allOf`.

## 5.134.2

**`(fix):`** Fix environments defined in `generators.yml` disappearing from docs (`GET ///path`, empty Try It base URL)
when an `api:` navigation block uses `audiences:`. Environments that don't declare audiences are now
retained under audience filtering, matching the Fern Definition behavior.

## September 23, 2026

## 5.134.1

**`(fix):`** The OpenAPI `error-responses` setting now replaces a pre-existing `components.schemas` entry of
the same `name` when nothing references it anymore once the 4xx/5xx responses have been rewritten
(the common case: a legacy error body under `apply-to: all`), so specs that ship their own
`TwilioServiceErrorResponse`-style schema no longer need a per-spec overlay to remove it first.
If the legacy schema is still referenced (a 2xx body, another schema, `apply-to: untyped`), the
error now lists the offending JSON Pointers.

## 5.134.0

**`(fix):`** Fix OpenAPI `allOf` required-ness when a branch lists a property in `required` that is defined
only by another (parent) branch. The property is now required on the composed type, so a
`nullable: true` property becomes required-nullable and round-trips `null` in generated SDKs.
Multi-level `allOf` chains are handled; properties required in no branch stay optional.

**`(fix):`** When an OpenAPI `allOf` parent is inlined into a type or request body because of a property
conflict, the inlined properties now keep their metadata (`readOnly` filtering on write
request bodies, `x-fern-property-name`, `x-fern-audiences`, `deprecated`, access, and XML
encoding) instead of being copied as bare type references.

**`(fix):`** Fix `fern check` reporting duplicate properties when an OpenAPI schema with a `nullable: true`
`allOf` parent lists parent-defined properties in its own top-level `required`. The nullable
parent is now inlined (instead of being kept in `extends` alongside the redeclared property).

**`(feat):`** The OpenAPI importer used for SDK generation now honors `4XX` and `5XX` wildcard error
responses instead of silently dropping them. Wildcards are imported as `ClientRequestError`
(covers 400-499) and `ServerError` (covers 500-599), and a concrete status code declared
alongside a wildcard always takes precedence. Fern Definition `errors` now accept
`status-code: 4XX` / `status-code: 5XX` as well.

## 5.133.0

**`(internal):`** The CLI now sends an `X-Fern-Agent` header on every FDR, Venus and Fiddle request
(and tags its own telemetry events with `agent`) when run from a coding agent
(Claude Code, Cursor, Codex, Devin, Gemini CLI), so agent-driven usage such as
docs publishes can be measured separately from human usage.

**`(fix):`** `fern init --docs` now produces a project that builds with no further edits. When no API
definition exists in the fern folder, it scaffolds `pages/welcome.mdx` and points the
navigation at it instead of emitting an `api:` item with nothing to render. `fern check`
also reports a new `api-section-has-definition` error when an `api:` navigation item does
not resolve to any API definition, instead of passing and then failing at build time.

## 5.132.0

**`(feat):`** Add an `error-responses` OpenAPI setting that applies a single error body schema (e.g. RFC 9457
Problem Details) to the 4xx/5xx responses of every operation in a spec, so per-spec overlays are no
longer needed to type error responses.

```yaml
api:
  specs:
    - openapi: openapi.yml
      settings:
        error-responses:
          schema: errors/problem_details.yml   # file path or inline schema
          name: ProblemDetails                 # generated type name (defaults to the schema title)
          apply-to: all                        # `all` (default) or `untyped`
          ensure:
            - status-code: 422
              methods: [post, put, patch]
```

`apply-to: all` replaces the body of every error response; `untyped` only fills in responses that
declare no body schema. `ensure` adds the listed status codes to operations that do not declare them.

## September 22, 2026

## 5.131.3

**`(fix):`** 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.

## 5.131.2

**`(fix):`** Route generators.yml `version: latest` through sdk-gen-api as an unpinned Fern generator request.

## September 21, 2026

## 5.131.1

**`(fix):`** Preserve omitted SDK Config generator versions so sdk-gen-api can resolve the latest generator server-side.

## 5.131.0

**`(feat):`** Add the `layout.breadcrumbs.current-page` docs.yml setting. When set to true,
the current page is appended to the breadcrumb trail above the page title as a
non-clickable item. Defaults to false.

## 5.130.0

**`(feat):`** Add `output: { location: fern-hosted, slug: <slug> }` to `generators.yml` for
`fernapi/fern-mcp-server`. `fern generate` builds the MCP server through sdk-gen-api,
deploys it to Fern's hosted MCP platform, and prints the server URL. `slug` is optional
(default `mcp`) and supports `${ENV_VAR}` substitution.

## September 18, 2026

## 5.129.0

**`(feat):`** Add `settings.embedding.allowed-origins` to docs.yml. Origins listed there may embed the
docs site in an iframe (they are appended to the `frame-ancestors` directive of the
Content-Security-Policy header). By default only the site itself may frame it.

## 5.128.4

**`(fix):`** Preserve portable API import settings, package metadata, README sections, response validation, and language-specific settings when migrating generators.yml to SDK Config.

## September 17, 2026

## 5.128.3

**`(fix):`** Register error-status endpoint examples carrying the error response headers' example values
(e.g. a 429's `Retry-After`), so docs render them when `show-headers-in-examples` is enabled.

## 5.128.2

**`(fix):`** Honor declared examples on OpenAPI response headers. Media-type `example`/`examples`
and `example`/`examples` on the referenced component schema now land in
`userSpecifiedExamples` (matching request-header parameter parity) instead of being
skipped, so an object-schema `examples` block like
`examples: [{content_type: image/jpeg}]` on the header's `$ref`'d schema is used
rather than generic per-property autogenerated values.

## 5.128.1

**`(fix):`** Fix `<Markdown src="..." />` snippets placed directly inside a list item (e.g. `10. <Markdown src="..." />`)
breaking out of the list. Continuation lines of the snippet are now indented to the list item's content column.

## 5.128.0

**`(feat):`** Local generation now authenticates to Docker Hub itself when pulling a private
`fernenterprise` image, using the `DOCKERHUB_OAT` organization access token — the same
credential and variable name self-hosted Fern Docs already documents. Setting it removes the
separate `docker login` step; leaving it unset keeps using whatever credentials Docker already
holds. The token is sent only for images in that organization's namespace, and is passed on
the runner's stdin rather than as a command argument. `DOCKERHUB_OAT_USERNAME` overrides the
organization, for a staging or personal namespace.

## 5.127.0

**`(feat):`** Add `settings.show-headers-in-examples` to docs.yml. When enabled, endpoint
response examples include a raw HTTP block with the response status line and
response header examples. Also registers response header examples (from each
header's user-specified or autogenerated examples) onto endpoint examples sent
to FDR, including headers declared on error responses.

## 5.126.0

**`(feat):`** Every entry of a schema-level `examples` array on an OpenAPI request or response body schema now
becomes a separate, selectable example in the API reference (labelled `Example 1`, `Example 2`, ...)
whenever the media type object does not define its own `example`/`examples`. Previously only the
first schema-level example was used.

## September 16, 2026

## 5.125.3

**`(fix):`** Preserve OpenAPI top-level `tags[].description` as the package description when importing
OpenAPI specs with the default parser, so tag descriptions reach the docs API definition.

## 5.125.2

**`(chore):`** No functional changes. Verifies the CLI release pipeline after the beta publish step was added.

## 5.125.1

**`(fix):`** dynamic IR now sets `wrapperProperty` on auth schemes when the API has multiple auth schemes so snippet generators can nest constructor options the way generated SDKs expect.

## September 15, 2026

## 5.125.0

**`(feat):`** Add `base-url-env` to the `api.yml` environments configuration and the root-level
`x-fern-base-url-env` OpenAPI extension. The value is the name of an environment variable
(e.g. `MY_API_BASE_URL`) that generated SDKs read to override the base URL, mirroring how
auth credentials can already be sourced from environment variables. When both are present,
`base-url-env` in `generators.yml` wins over the spec's `x-fern-base-url-env`; overriding
`api.environments` alone does not discard the spec's value. The setting is carried through to
the IR as `environments.baseUrlEnvVar`; SDK generators must be updated to honor it.

`fern check` now warns (`valid-base-url-env`) when `base-url-env` is set but no environments
are declared, since the variable only overrides the default environment and would otherwise
be dropped silently.

## 5.124.0

**`(feat):`** Add a top-level `changelog` key to `docs.yml` for multi-product sites. The changelog is shared
by every product, served at the site root (e.g. `/changelog`) instead of under a product slug,
and does not appear in the product switcher.

```yaml
products:
  - display-name: Ferns
    path: products/ferns.yml
  - display-name: Cacti
    path: products/cacti.yml
changelog:
  changelog: ./changelog
```

## 5.123.1

**`(fix):`** The OpenAPI importer now unions `required` across all `allOf` branches. Previously, when a child
`allOf` branch redeclared a property that a parent branch marked as required (without listing it
in its own `required`), the property was imported as optional. Required nullable properties are
now correctly represented as `nullable` in the IR rather than `optional`.

## 5.123.0

**`(feat):`** Configure Postman's on-prem SDK generators from `sdk-config.yml` on local generation. A generator at or above its language's cutover version reads the migrated configuration written by `fern sdk migrate`, and an unmigrated workspace is told how to migrate rather than generated from `generators.yml`. Generators below the cutover continue to run from `generators.yml` unchanged.

**`(internal):`** Local generation can now run the generator container with a specific network mode, set with the
FERN\_GENERATOR\_NETWORK environment variable. Setting it to `none` runs the generator with no
network access, which air-gapped environments require. Unset, container networking is unchanged.

**`(internal):`** A generator image can now be pinned by digest in generators.yml, for example
`name: fern-python-sdk@sha256:...`. The digest is passed through to the container runtime
unchanged so the exact pinned image runs, while the generator name used for IR version
resolution is unaffected. A malformed digest is rejected with an error naming generators.yml.
Tag-based references are unchanged.

**`(internal):`** Setting the USE\_FERN\_RC environment variable runs the on-prem adapter's current pre-release
instead of the version the workspace asks for, for following the adapter internally before its
release versions exist. It applies only to an invocation that already resolves to the adapter,
and a digest-pinned image still wins. Unset, the version in generators.yml is what runs.

**`(internal):`** The on-prem adapter cutover check now compares versions with semver rather than a hand-rolled
parser, so a partial version like `6` or `v6.1` is read correctly. A version semver cannot read
at all, such as the `latest` that local generation defaults to, means Fern's own generator:
selecting the adapter is done by naming its version.

**`(internal):`** When a generator image is pinned by digest, the generation log now also reports the version
declared in generators.yml. A digest identifies the artifact but not which generator release it
is, which made a pinned run hard to correlate back to a version.

**`(internal):`** FERN\_RC\_NAMESPACE overrides the namespace the on-prem adapter's pre-release is pulled from,
defaulting to `fernenterprise`, for pointing a run at a staging or personal namespace without
editing generators.yml. Only applies when USE\_FERN\_RC is set.

## September 14, 2026

## 5.122.0

**`(feat):`** Preserve OpenAPI `xml` metadata when importing object schemas. Schemas with an `xml` object
are emitted with `encoding.xml` (name, namespace, prefix) in the IR, and their properties carry
`ObjectProperty.xml` describing whether they serialize as an attribute, text body, or child
element (including `wrapped` lists and the new `x-fern-xml-list-separator` / `x-fern-xml-text`
extensions). The same metadata can be expressed in Fern Definition files via `encoding.xml`.

## 5.121.2

**`(fix):`** Autogenerated examples now include required nullable properties with an explicit `null` instead of omitting them.
Previously these properties were treated as optional, so generated SDK examples and wire tests could omit a key
that the serialization layer requires.

## 5.121.1

**`(fix):`** `fern generate --local` without a `FERN_TOKEN` (and air-gapped remote generation) now enables
pagination and OAuth client generation by default instead of silently disabling them. Previously
the Python SDK's paginated endpoints returned a plain response object while the README documented
a pager, because the org lookup that enables these features was skipped.

## September 11, 2026

## 5.121.0

**`(feat):`** Add an optional `disclaimer` field to the `ai-search`/`ai-chat` docs.yml config.
It overrides the disclaimer shown in the Ask Fern chat (default:
"Responses are generated using AI and may contain mistakes.").

## 5.120.5

**`(fix):`** Fix `theme.tabs.placement` / `theme.tabs.alignment` being sent to the docs publishing API in lowercase,
which caused `fern generate --docs` to fail with `config.theme.tabs: Invalid input` even though
`fern check` passed.

## 5.120.4

**`(fix):`** Honor `required` on OpenAPI response headers: header value types are only wrapped in
`optional` when the Header Object does not declare `required: true`, matching the
request-parameter behavior.

## 5.120.3

**`(fix):`** `fern check` now validates changelogs inside a product's nested `versions` against
their full `/product/version/...` URL, so a changelog made servable by either the
product or version slug (e.g. `/platform/release-notes/updates`) is no longer
rejected by the `valid-changelog-slug` rule. Previously the docs validator never
traversed `product.versions` files.

## 5.120.2

**`(fix):`** `fern check` no longer rejects a changelog whose feed URL is made servable by its
parent product or version slug (e.g. a "Release Notes" product with an "Updates"
changelog tab at `/release-notes/updates`). The `valid-changelog-slug` rule now
includes the product/version URL segment when checking for an allowlisted segment
and reports the full resolved path.

## September 10, 2026

## 5.120.1

**`(fix):`** Support sdk-gen-api generation for Fern Definition workspaces with no source specs.

**`(fix):`** Allow sdk-gen-api runtime bundles up to the existing 100 MiB decoded payload budget.

## 5.120.0

**`(feat):`** Add an opt-in OpenAPI setting `respect-operation-id-word-boundaries`. When enabled, operation ids
are split on every word boundary (camelCase transitions and digits) when deriving endpoint names,
so a redundant tag prefix is stripped and the remaining words are preserved: with tag `sharing`,
`Sharing_ListFolderMembers` becomes `listFolderMembers` instead of `listfoldermembers`, and with
tag `files`, `filesGetThumbnailV2` becomes `getThumbnailV2` instead of keeping the tag prefix.
This applies to the v3 OpenAPI parser, so it affects generated API reference URLs. Defaults to
false, since enabling it changes the URLs of already published pages.

## September 9, 2026

## 5.119.2

**`(fix):`** Convert OpenAPI response header schemas (including header `content` schemas when
`respect-parameter-content` is enabled) into typed references instead of collapsing
them to `optional<string>`. Object, enum, array, and `$ref` response headers now carry
their schema into IR, so docs render expandable schema properties on response headers
just like request headers.

## 5.119.1

**`(fix):`** Use schema-level `example`/`examples` for OpenAPI parameters (including JSON-encoded
object headers resolved via `respect-parameter-content`) when the parameter itself has
no example, instead of autogenerating one from property types.

## 5.119.0

**`(feat):`** Add a `layout.api-reference-expand-properties` option to docs.yml. Set it to `true` to
render the first level of nested object and union fields in the API reference expanded on
page load instead of behind a "Show N properties" button. Deeper levels stay collapsed.

## 5.118.0

**`(feat):`** Allow `fern generate --sdk-config <path>` to validate an SDK Config v1 YAML or JSON document and submit it to sdk-gen-api for multi-target expansion. Generation without the flag continues through the existing legacy Fern configuration and IR flow.

## September 8, 2026

## 5.117.0

**`(feat):`** Add support for playground-specific auth documentation. Set `x-fern-playground-description` on an
OpenAPI security scheme (or `playground-docs` on a Fern definition auth scheme) to render text below
that scheme's input in the API playground, leaving the API reference's authorization description
(`description`/`docs`) untouched. Applies to bearer, basic, header, and OAuth client-credentials
schemes. Supports a markdown subset: `[label](url)` links (absolute or relative), bare URLs,
`inline code`, and blank-line-separated paragraphs.

**`(feat):`** Write `fern sdk migrate` output as sparse YAML and default to `sdk-config.yml` beside the selected `generators.yml` when `--output` is omitted, without modifying the existing Fern project files. Source-derived environments and authentication remain in the referenced API specifications instead of being duplicated in SDK Config, empty global configuration blocks are omitted, and explicit Fern overrides are preserved.

## 5.116.0

**`(feat):`** Add `github.workflows: false` to `generators.yml` (defaults to `true`). When disabled, generated
`.github/workflows/*` files are not committed to the SDK repository: existing workflow files are
left untouched and newly generated ones are skipped. Useful when the GitHub App used to push
does not have the `workflows` permission.

## 5.115.0

**`(feat):`** `fern generate --local` now supports `FERN_CA_BUNDLE`: set it to a PEM CA bundle on the host and the file is
mounted read-only into the generator container with `NODE_EXTRA_CA_CERTS`, `SSL_CERT_FILE` and `GIT_SSL_CAINFO`
pointing at it. This lets network calls made *inside* the generator container succeed behind a corporate
TLS-interception proxy: `pnpm install` (TypeScript), `go mod tidy` (Go), and `dotnet format`'s implicit NuGet
restore (C#).

`SSL_CERT_FILE`/`GIT_SSL_CAINFO` replace rather than extend the trust store, so the file must be a complete
bundle — the public roots plus your corporate CA. On Linux the system maintains one at
`/etc/ssl/certs/ca-certificates.crt`; elsewhere you can build one from the roots Node already ships:

node -e 'console.log(require("tls").rootCertificates.join("\n"))' > \~/certs/fern-ca-bundle.crt
cat corp-root.pem >> \~/certs/fern-ca-bundle.crt

The path is a bind-mount source resolved by the container runtime rather than by the CLI, so it has to be
visible to that runtime. Before generating, the CLI now starts a short-lived probe container to confirm the
bundle is really visible inside it, and fails with guidance for your platform when it is not — this catches
Colima, podman machine and Docker-in-Docker, where an unresolvable bind source is silently replaced with an
empty directory instead of raising an error.

The JVM ignores these variables, so the CLI warns for Java generators, whose Gradle steps need
`FERN_JAVA_SKIP_FORMATTING=true` on such networks.

**`(fix):`** Environment variables passed to local generator containers are no longer wrapped in literal quote characters
(`-e KEY="value"`), which previously leaked the quotes into the value seen by the generator.

## September 4, 2026

## 5.114.1

**`(fix):`** Scope the `namespaced-errors` OpenAPI setting to the spec that enables it, and only honor an explicit
`x-fern-sdk-namespace` on the response object. Previously enabling the setting on one spec applied it to
every spec in the API, and errors whose body schema lived in a namespace were moved into that namespace.

## 5.114.0

**`(feat):`** Add the `namespaced-errors` OpenAPI setting (default `false`). When enabled, an error whose
response object (`components.responses[...]`) or body schema carries `x-fern-sdk-namespace` is
declared in, and its shared-error conflict detection is scoped to, that namespace instead of the
endpoint's. This lets each namespace get its own typed `TooManyRequestsError` etc. while endpoints
and other types stay at the root.

**`(fix):`** Fix object schema equality in the OpenAPI importer: two structurally identical inline object
schemas were never considered equal, so a shared `components.responses` entry with an inline body
referenced by several endpoints collapsed the shared error to `unknown`.

## 5.113.3

**`(fix):`** Revert the namespace-scoped shared-error collapse (#17619) and the case-insensitive namespace/tag flattening
(#17643) in the OpenAPI importer. Shared errors are again compared API-wide by status code, and an operation tag
that only matches the spec `namespace` case-insensitively is again treated as a sub-group.

## September 3, 2026

## 5.113.2

**`(fix):`** Fall back to an OpenAPI parameter's inline schema description when the parameter itself has no
description, so query, header, and path parameter docs appear in generated API references.

## 5.113.1

**`(fix):`** When an OpenAPI spec has `namespace` set, an operation tag that matches the
namespace case-insensitively (e.g. tag `Video` with `namespace: video`) is now
treated as the namespace itself instead of creating a nested `video.video`
sub-package.

## 5.113.0

**`(feat):`** Add `fern sdk migrate` to create Postman SDK Config v1 from existing Fern SDK groups, including the exact single- or multi-spec API source paths. Repeat `--group` to consolidate groups that resolve to the same API schema and source configuration into one multi-language configuration.

## 5.112.1

**`(fix):`** When importing OpenAPI specs with `namespace` set, shared SDK errors are now
collapsed to `unknown` per namespace instead of across the whole API. A status
code that has a different body schema in one namespace no longer degrades the
typed error body in other namespaces.

## September 1, 2026

## 5.112.0

**`(fix):`** Supply resolved API source archives when `fern sdk preview` routes generation through sdk-gen-api,
and accept the empty default OpenAPI audience filter during SDK Config source validation.

**`(internal):`** Select sdk-gen-api payload routes before generation work, preserve legacy Fern runtime bundles for pre-cutover targets, and require SDK Config v1 at or after each generator's cutover version. Reject incompatible legacy configuration with an actionable `fern sdk migrate` instruction before source preparation or remote mutations, while preparing deterministic, deduplicated source archives for compatible targets.

## 5.111.0

**`(feat):`** Add the `any-of-sibling-properties-as-object` OpenAPI setting. When enabled, a
schema that declares `properties` alongside an `anyOf` whose branches only
re-declare some of those same properties as required is converted as the object
it declares, rather than as an undiscriminated union. Per JSON Schema such an
`anyOf` is an "at least one of" constraint over sibling properties, not a set of
variants, so converting it to a union discards the declared `properties` and
makes the fields mutually exclusive -- a request body setting two of them
silently sent only one.

A branch that introduces a property, that narrows one to a different value, or
that is a reference, is a real variant and continues to produce a union even
with the setting enabled. The setting defaults to false, so conversion output is
unchanged unless you opt in.

## 5.110.1

**`(fix):`** The warning for `auth-schemes` declared without `api.auth` now fires on
`fern generate` and `fern check`, not only `fern check --from-openapi`. It
was emitted from `OSSWorkspace.getIntermediateRepresentation`, a branch
reached only when `--from-openapi` is passed; `fern generate` and plain
`fern check` go through `toFernWorkspace` and saw nothing. Since the whole
point is that this misconfiguration is otherwise silent — valid YAML, clean
check, successful generation, and a client reading an environment variable
the user never configured — the warning was unreachable on exactly the paths
where it was needed. Both entry points now emit it, at most once per
workspace.

## August 31, 2026

## 5.110.0

**`(feat):`** Add `FERN_RUNTIME_ENV_VARS`, which defers the listed environment variables past
generation for self-hosted docs. Instead of being substituted with their build-time
value, `${APP_SERVER}` is rewritten to a `FERN_SELF_HOSTED_ENV_APP_SERVER` placeholder
that the self-hosted container resolves on every request, so a single generated image
can serve deployments that differ only in those values.

## 5.109.3

**`(fix):`** Preserve `deprecated`/`x-fern-availability` on OpenAPI object properties whose value is a
`$ref` (or a single-`$ref` `allOf`). Previously availability was only read off inline
schemas, so a request body property referencing a deprecated component schema rendered
without a Deprecated badge, while the equivalent query parameter did.

`x-fern-availability` written alongside a `$ref` now overrides the referenced schema's
availability, so a property can opt out of an inherited `deprecated`.

Note: existing specs may start showing Deprecated (or Beta) badges on properties that
reference an already-deprecated component schema, and the corresponding fields in
generated SDKs will pick up deprecation annotations. No spec changes are required.

## 5.109.2

**`(fix):`** Warn when `generators.yml` declares `auth-schemes` but no `api.auth` to select them. The
workspace only reads the `auth-schemes` block when `api.auth` is set, so declaring schemes
without it silently discards the whole block — `env:` overrides included — before the importer
sees it. Auth is then re-derived from the spec's `securitySchemes`, which carries no
environment variable, and each generator falls back to its own default name (the CLI
generator to `<BINARY>_TOKEN`). Nothing is invalid, so `fern check` stayed clean and
generation succeeded while producing a client that read an environment variable the user
never configured. The warning names the schemes being dropped and the `auth:` line that
applies them.

## 5.109.1

**`(fix):`** Fix `fern check` and docs previews failing with an uncaught error (e.g. "Expected one of ...
Received \[object Object]") when the `broken-links` rule builds an API definition for an
api section. The rule now resolves the API definition the same way the docs build does,
skips link validation for an API it cannot load, and a rule that throws mid-validation is
reported as a violation honoring its configured severity instead of aborting the command.

## 5.109.0

**`(fix):`** Convert a GraphQL interface to its own set of fields and record each `implements` clause on the
implementing type, so docs can list an interface's fields and the types that implement it.

**`(fix):`** Don't document GraphQL operation-namespace types (e.g. a `Mutation.checkout: CheckoutMutations`
grouping type) as types of their own. Their fields are already documented as operations, so a
type page for them duplicated every field and argument on the referenced types' pages.

**`(feat):`** Record the GraphQL kind (object, input, enum, scalar, interface, union) of every named type
read from a GraphQL schema, so docs can render a Types section.

**`(feat):`** GraphQL API references now get a page per named type in the schema, collected under a single
"Types" section and grouped within it by the kind each type was declared with (Objects,
Inputs, Enums, Scalars, Interfaces, Unions). Every GraphQL spec in the API section contributes
to that one section, and it sits at the API root rather than under a subpackage. A kind the
schema does not declare produces no group, and type pages live at `<api>/types/<kind>/<type-name>`.

## August 27, 2026

## 5.108.0

**`(internal):`** Send generator-compatible Fern runtime bundles with sdk-gen-api build requests.

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