diff --git a/fern/products/api-def/api-def.yml b/fern/products/api-def/api-def.yml index 52197fec1..a9e7e0824 100644 --- a/fern/products/api-def/api-def.yml +++ b/fern/products/api-def/api-def.yml @@ -60,6 +60,8 @@ navigation: path: ./openapi/extensions/explorer.mdx - page: Global headers path: ./openapi/extensions/global-headers.mdx + - page: Global parameters + path: ./openapi/extensions/global-parameters.mdx - page: Ignoring elements path: ./openapi/extensions/ignore.mdx - page: SDK method names diff --git a/fern/products/api-def/openapi/extensions/global-parameters.mdx b/fern/products/api-def/openapi/extensions/global-parameters.mdx new file mode 100644 index 000000000..82d91123b --- /dev/null +++ b/fern/products/api-def/openapi/extensions/global-parameters.mdx @@ -0,0 +1,106 @@ +--- +title: Global parameters +headline: Global parameters (OpenAPI) +description: Declare parameters set once at the client level and injected into every relevant request using the `x-fern-global-parameters` extension +--- + +A **global parameter** is a value set once — at the SDK client level or the CLI config level — and injected into every relevant request, instead of being passed on every call. Per-call values always win over the global value. + +Global parameters differ from [global headers](/learn/api-definitions/openapi/extensions/global-headers): a global header is always a header, while a global parameter can target a header, query parameter, path parameter, or a field in the request body. + +## Declare global parameters + +Use the `x-fern-global-parameters` extension at the root of your spec. Each entry declares one parameter: + +```yaml title="openapi.yml" +x-fern-global-parameters: + - name: currency + in: body + target: config.currency + env: ACME_CURRENCY + default: USD + optional: true + apply: auto + docs: The currency code used for pricing. + - name: region + in: path + target: regionId + env: ACME_REGION + default: us + apply: explicit +``` + +### Fields + + + The canonical identifier for the parameter. It's the base for the generated flag or constructor argument, and the key operations use to [opt in](#apply-to-specific-operations). + + + + Where the value is injected on the wire: `body`, `query`, `header`, or `path`. + + + + The wire-level injection target. For `body`, a dotted path into the request body (for example, `config.currency`). For `query`, `header`, and `path`, the parameter or header name. Defaults to `name`. + + + + The value type: `string`, `integer`, `double`, or `boolean`. + + + + An environment variable the value falls back to when the caller doesn't provide one. + + + + A client-side default used when neither the caller nor the environment variable supplies a value. [`x-fern-default`](/learn/api-definitions/openapi/extensions/default-values) takes precedence over `default`. + + + + Whether the parameter can be omitted. A required parameter with no value, default, or environment variable produces an error. + + + + How the parameter applies to operations. `explicit` applies only to operations that [opt in](#apply-to-specific-operations); `auto` applies to every operation whose request contains the target. + + + + An SDK/CLI-facing alias. When set, this name is used for the generated flag or constructor argument instead of `name`. + + +## Apply to specific operations + +When a parameter uses `apply: explicit` (the default), it applies only to operations that opt in with the per-operation `x-fern-global-parameter` extension. List the parameter names to include. The value accepts a single string or a list: + +```yaml title="openapi.yml" {4-6,12} +paths: + /v1/products/{regionId}/search: + post: + x-fern-global-parameter: + - region + - currency + operationId: searchProducts + # ... + /v1/products/{regionId}/{productId}: + get: + x-fern-global-parameter: region + operationId: getProduct + # ... +``` + +Each name must match a parameter declared in `x-fern-global-parameters`. A parameter with `apply: auto` is injected into every operation whose request contains its target, with no opt-in required. + +## Resolution order + +At runtime, the value is resolved from the first available source, in order: + +1. The per-call value (a per-operation parameter or an explicit request field) — this always wins. +2. The CLI flag or constructor argument. +3. The environment variable (`env`). +4. The client-side default (`x-fern-default`, then `default`). + +For a `body` parameter with a nested `target`, a value the caller already supplies at that path is never overwritten. + +## Generated CLI behavior + +The [CLI generator](/learn/cli-generator/get-started/openapi-extensions#global-parameters) registers each global parameter as a top-level flag (with its `env` fallback and `default`) and injects the resolved value at the declared location for every applicable command. diff --git a/fern/products/api-def/openapi/extensions/overview.md b/fern/products/api-def/openapi/extensions/overview.md index da37a84fc..626614299 100644 --- a/fern/products/api-def/openapi/extensions/overview.md +++ b/fern/products/api-def/openapi/extensions/overview.md @@ -26,6 +26,7 @@ The table below shows all available extensions and links to detailed documentati | [`x-fern-examples`](./request-response-examples) | Associate request and response examples | | [`x-fern-explorer`](./api-explorer-control) | Control API Explorer (playground) availability globally or per endpoint | | [`x-fern-global-headers`](./global-headers) | Configure headers used across all endpoints | +| [`x-fern-global-parameters`](./global-parameters) | Configure parameters set once and injected into every relevant request | | [`x-fern-header`](/api-definitions/openapi/authentication#apikey-security-scheme) | Customize API key header authentication parameter names and environment variables | | [`x-fern-idempotent`](./idempotency) | Mark an endpoint as idempotent | | [`x-fern-idempotency-headers`](./idempotency) | Configure idempotency headers for safe request retries | diff --git a/fern/products/cli-generator/openapi-extensions.mdx b/fern/products/cli-generator/openapi-extensions.mdx index 7e5a0bb66..a5d34c879 100644 --- a/fern/products/cli-generator/openapi-extensions.mdx +++ b/fern/products/cli-generator/openapi-extensions.mdx @@ -124,6 +124,40 @@ Produces `--api-version` instead of `--x-api-version`. See [Customize parameter names](/learn/api-definitions/openapi/extensions/parameter-names) for more details. +## Global parameters + +### `x-fern-global-parameters` + +Registers a value that's configured once and injected into every applicable command, rather than passed on each invocation. Each declared parameter becomes a top-level `--` flag with its environment-variable fallback and client-side default, injected at the declared location (`body`, `query`, `header`, or `path`). + +```yaml title="openapi.yml" +x-fern-global-parameters: + - name: currency + in: body + target: config.currency + env: ACME_CURRENCY + default: USD + apply: auto +``` + +The value resolves from the first available source: the CLI flag, then the environment variable, then the default. A per-operation parameter with the same target overrides the global. + +```bash +# CLI flag takes priority +acme products search --currency EUR + +# Otherwise falls back to the environment variable +export ACME_CURRENCY=EUR +acme products search + +# Otherwise sends the default (USD) +acme products search +``` + +An `apply: auto` parameter applies to every command whose request contains the target; an `apply: explicit` parameter applies only to operations that opt in with `x-fern-global-parameter`. + +See [Global parameters](/learn/api-definitions/openapi/extensions/global-parameters) for the full field reference and resolution order. + ## Pagination ### `x-fern-pagination`