> 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.

## 1.35.2

**`(fix):`** List-valued XML (TwiML) attributes and text accept a space-separated String or a single
value (including a Symbol) in addition to an Array, matching the legacy call style:
`response.gather(input: "speech dtmf")` and `dial(status_callback_event: :answered)` no
longer raise `NoMethodError`.

## 1.35.1

**`(fix):`** Fluent XML (TwiML) child methods accept the text content as a keyword as well as positionally,
matching the legacy call style: `response.say(message: "x")`, `response.dial(number: "+1555")` and
`response.message(body: "hi")` now emit the text instead of silently dropping it. Passing the text
both positionally and as a keyword raises `ArgumentError`.

## 1.35.0

**`(feat):`** XML (TwiML) types support the legacy twilio-ruby building style: constructors and fluent child methods yield the
new element to a block (`VoiceResponse.new { |r| r.say("hi") }`, `r.gather { |g| g.say("one") }`), and
`add_child` also accepts an element name with text and attributes (`r.add_child("Custom", "v", a: "1")`).

## 1.34.2

**`(fix):`** Enum-typed attributes and text on XML (TwiML) types are open on the wire: `from_xml` keeps a value the enum does
not declare (e.g. a voice added after the SDK was generated) instead of raising, and it round-trips through
`to_xml`. This matches how the same enums already behave in JSON.

## 1.34.1

**`(fix):`** Endpoints whose request body is an array, set, map, primitive, enum, optional/nullable object, or an alias of
one of these now send the body argument itself (e.g. `[{"name":"Monstera"}]`) instead of wrapping it with the
other keyword arguments (e.g. `{"request": [...]}`). This also applies to such bodies on endpoints with headers
or query parameters, which no longer leak into the body. Objects inside these bodies (optional/nullable objects,
list and set items, and map values) are serialized through their model so fields use their wire names, sets are
sent as JSON arrays, and an omitted optional body is still sent without a body.

## 1.34.0

**`(feat):`** Add opt-in `userAgentOnly` config. When enabled, generated clients send the `User-Agent`
header (including the structured form from `includePlatformHeaders`) but omit the
`X-Fern-Language`, `X-Fern-SDK-Name`, and `X-Fern-SDK-Version` headers. Disabled by default,
so existing generated output is unchanged. `omitFernHeaders` still takes precedence and drops
the `User-Agent` too.

## 1.33.0

**`(feat):`** The generated `WebhooksHelper` HMAC verifier now accepts a per-call algorithm override via an optional `algorithm` parameter on `verifySignature`,
one of `sha1`, `sha256`, `sha384` or `sha512`. When omitted, the algorithm configured in
`webhook-signature` is used, so existing callers are unchanged. This lets one endpoint verify both
legacy HMAC-SHA1 (auth-token) and HMAC-SHA256 (shared-key) signed webhooks.
The verifier also logs a warning distinguishing an early failure (missing signature header) from a
failed verification (signature mismatch); it still returns `false` and never throws.

## 1.32.0

**`(feat):`** XML (TwiML) types keep text segments, typed child models and raw `Element` children in a single
ordered `content` list, so `to_xml` emits them in the order they were added
(`response.say("a"); response.add_child(Element.new("Custom")); response.say("b")` yields
`<Say>a</Say><Custom/><Say>b</Say>`) and `from_xml` preserves document order, including the
position of unknown elements. Adds `add_text(String)` to XML types and `Element` for mixed content
such as `<Say>Hi <break strength="weak"/> world</Say>`. Typed child properties and additional
children remain available and are reconciled into the content order on serialization.

## 1.31.1

**`(fix):`** XML-encoded (TwiML) types now include the `<?xml version="1.0" encoding="UTF-8"?>`
declaration by default when serialized to XML; pass the declaration flag as `false`
to omit it. Nested child elements and raw `XmlElement`s are still written without it.

## 1.31.0

**`(feat):`** Add support for SDK variables (`x-fern-sdk-variables` / `variables` in `api.yml`).
Each variable is exposed as an optional keyword on the root client (e.g.
`Client.new(target_account_sid: "AC...")`); path parameters bound to a variable are
removed from the endpoint methods and request classes, and the value is read from
the client instead. String variables declared with an `env` fall back to
`ENV.fetch("<ENV_VAR>", nil)` when the keyword is omitted, and endpoints raise an
`ArgumentError` with a clear message when a required variable is still unset.