Skip to navigation

2.92.12

(fix): README generation in self-hosted GitHub mode can clone a private repository with a personal access token again. Upgrades @fern-api/generator-cli to 0.12.1, which also sends the token as an Authorization header. Before this, git in the generator image (libcurl 8.23+) dropped the token from the clone URL and failed with could not read Username.

2.92.11

(fix): XML (TwiML) serialization writes empty elements with an explicit close tag (<Hangup></Hangup>) instead of a self-closing <Hangup />, matching the legacy twilio-csharp output byte for byte.

2.92.10

(fix): The generator image keeps Alpine 3.22’s libcurl (< 8.23). curl 8.23.0 strips credentials from the effective URL it reports, which made git treat every authenticated https clone as a redirect and drop the token, so README generation and GitHub output for private repositories failed inside the container with “could not read Username for ‘https://github.com‘“.

2.92.9

(fix): XML (TwiML) types match the legacy call shapes: when an element’s text property has the same name as one of its child elements, the child builder keeps the name (message.Body("hi") adds a <Body> child, dial.Number("+1…") a <Number>) and the text property is renamed to Text; every element with text content gets a new Say("hi") constructor next to the parameterless one; child builders whose text is a format: uri string accept a System.Uri (Redirect(new Uri("/voice", UriKind.Relative))).

2.92.8

(fix): Fix WebhooksHelper.VerifyRequest failing to compile on net462/netstandard2.0 (CS1503: cannot convert from 'string' to 'char') when webhook-signature.algorithm-header uses key-id-parameter/algorithm-parameter: the settings header is now split with Split(new[] { "," }, StringSplitOptions.None) instead of the Split(string) overload that only exists on newer target frameworks.

2.92.7

(fix): C# dynamic snippets now keep nullable list and set item types (e.g. List<MyEnum?> for a multi-value query parameter typed optional<nullable<MyEnum>>), matching the SDK’s IEnumerable<MyEnum?> property type instead of failing with CS0266.

2.92.6

(fix): XML (TwiML) ToXml() drops characters outside the XML 1.0 Char production (e.g. \u0001) from text, attributes and comments instead of throwing ArgumentException.

2.92.5

(fix): XML (TwiML) fluent child builders now take the element’s text content as the first parameter, before attributes, so legacy-style calls such as response.Say("hi") and response.Dial("+15551234567") compile and set the content instead of an attribute. ToXml(xmlDeclaration, indent) adds an indented output option.

2.92.4

(fix): Escape form-urlencoded example keys and values when generating C# mock-server tests. Examples containing quotes, backslashes, or control characters now produce valid C# string literals instead of causing the formatter to fail with syntax errors.

2.92.3

(fix): WebhooksHelper.verifyRequest now parses name=value settings headers when webhook-signature.algorithm-header sets key-id-parameter/algorithm-parameter (e.g. Twilio’s X-Twilio-Webhooks-Signature-Settings: key=<id>,algorithm=HMAC_SHA256), so the key resolver receives the bare key ID instead of key=<id>. Requires IR 67.33.0.

2.92.2

(fix): The generated WebhooksHelper now consumes algorithm-header from api.settings.webhook-signature: a request-level verifyRequest helper reads the configured signature header first (missing or empty fails early with “could not run: missing signature header”), then the algorithm-selection header (e.g. X-Twilio-Webhook-Signature-Settings: <key_id>;HMAC_SHA256) to pick the HMAC algorithm from the configured wire values and hand the key ID to an application-supplied secret resolver. When the header is absent the configured default algorithm and the plain secret are used, so legacy auth-token flows keep working. The lower-level verifySignature is unchanged and still returns false without throwing.

2.92.1

(fix): reference.md is now generated for every output mode, matching the Go and Python generators. It was previously skipped unless the CLI passed a snippet path (local-file-system output without snippets: path: in generators.yml). README.md is unchanged and still requires snippets.

2.92.0

(feat): XML (TwiML) types can now carry XML comments. Comment(text) adds <!--text--> inside the element at its position in the ordered content (interleaved with AddText segments and child elements), while CommentBefore(text) / CommentAfter(text) render a comment immediately before or after the element itself (as a sibling in its parent, or around the root element after the XML declaration). Comments in parsed documents are preserved by FromXml and round-trip through ToXml; XmlElement.AddComment and the new XmlComment runtime type expose the same for untyped elements.

2.91.0

(feat): Generate a unit test file per XML-encoded (TwiML) type alongside the models, covering fromXml/toXml round trips, escaping, unknown attributes/children, open enum passthrough, child ordering, and rejection of malformed XML, wrong root elements and DOCTYPE declarations.

2.90.1

(fix): XML (TwiML) record types implement value equality: Equals/GetHashCode (and ==) compare the rendered XML, so VoiceResponse.FromXml(xml).Equals(VoiceResponse.FromXml(parsed.ToXml())) and new Say { Message = "x" }.Equals(new Say { Message = "x" }) are true. Previously the record default compared the collection members by reference and was always false.

2.90.0

(feat): Add opt-in user-agent-only config. When enabled, generated clients send the User-Agent header (including the structured form from include-platform-headers) 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. omit-fern-headers still takes precedence and drops the User-Agent too.

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

2.88.0

(feat): XML (TwiML) types keep text segments, typed child elements and raw XmlElement children in a single ordered Content list, so ToXml() emits them in the order they were added (Response.Say(a).AddChild(custom).Say(b) yields <Say>a</Say><Custom /><Say>b</Say>) and FromXml() preserves document order, including the position of unknown elements and repeated wrapper elements. Adds AddText(string) to XML types and XmlElement for mixed content such as <Say>Hi <break strength="weak" /> world</Say>. Typed child properties and AdditionalChildren remain available; AdditionalChildren is now derived from Content.

2.87.0

(feat): Support SDK variables (variables in api.yml / x-fern-sdk-variables in OpenAPI). Path parameters bound to a variable via x-fern-sdk-variable are removed from endpoint signatures and request types and are configured once on the client through the generated ClientOptions.<Variable> property. String variables that declare an env fall back to that environment variable, and a variable that is still unset fails with a clear ArgumentException before the request is sent.

2.86.3

(fix): XML-encoded (TwiML) types now return their XML representation from ToString() instead of JSON, and ToXml() prepends the <?xml version="1.0" encoding="utf-8"?> declaration by default. Pass ToXml(xmlDeclaration: false) to omit it.