sgcOpenAPI 2026.9.0 Latest
- 2026.9.0: 2026 September
- NewThe OpenAPI Parser now reads a specification that is not valid UTF-8. A JSON document must be UTF-8 according to RFC 8259, so the file is read as Windows-1252 and a warning is recorded instead of the parse failing. A UTF-16 file with a byte order mark is also read correctly.
- NewThe OpenAPI Parser now records warnings instead of failing silently. A missing openapi or info member, a member with the wrong JSON type, an operation that could not be generated, an unresolved path item reference and a JSON Schema keyword that is parsed but not yet honoured are all reported through the new Warnings property.
- NewThe OpenAPI Parser now understands which version of the specification it is reading, so a 3.0 document and a 3.1 document are no longer treated as the same thing. exclusiveMinimum and exclusiveMaximum are read as booleans in 3.0 and as numbers in 3.1, which is what each version requires.
- NewImproved OpenAPI Parser: added support for the OpenAPI 3.1 webhooks, jsonSchemaDialect and components.pathItems members, the license identifier, the mutualTLS security scheme, a type declared as an array such as ["string","null"], and a schema declared as a boolean. The remaining JSON Schema 2020-12 keywords are read and reported as not yet honoured rather than being dropped without trace.
- NewImproved OpenAPI Parser: added support for the OpenAPI 3.2 query operation and the additionalOperations map, so a path that declares them now generates the matching methods. They travel as a POST with an X-HTTP-Method-Override header.
- NewImproved OpenAPI Parser: an inline object schema now generates its own class instead of degrading to a string, and items is now read as a complete schema, so an array of inline objects, an array of enums and a nested array all generate the right type.
- NewImproved OpenAPI Parser: the generated client now supports cookie parameters, and the full OpenAPI parameter serialization rules, matrix, label, simple, form, spaceDelimited, pipeDelimited and deepObject, with explode and allowReserved.
- NewNew OpenAPI command line switch -r (or -remote) to allow converting a YAML or Swagger 2.0 document through the public converter at converter.swagger.io. It is off by default, see the breaking changes below.
- NewThe OpenAPI command line now sets an exit code, 0 on success and 1 to 7 for the different failures, so a build script can tell whether it worked. Error messages are now always written to the standard error output; the -l switch is only for progress logging.
- FixedFixed Bug OpenAPI Parser: the generated unit did not compile when a schema property was named after a Delphi reserved word such as property, class, string or function, when two properties differed only in case such as Name and name, or when a reference used a JSON Pointer escape such as #/components/schemas/Foo~1Bar. The wire name is preserved with a JSONName attribute when a property has to be renamed.
- FixedFixed Bug OpenAPI Parser: parameters declared once at the path level, which is the style the specification recommends and the style most public specifications use, were parsed and then dropped. The generated method took no arguments and the request was sent with the literal placeholder still in the URL, for example /pets/{petId}.
- FixedFixed Bug OpenAPI Parser: a specification containing any character outside ASCII was rejected with a UTF-8 error when the file had a byte order mark, and characters such as Chinese or Japanese were silently replaced by question marks.
- FixedFixed Bug OpenAPI Parser: converting a Swagger 2.0 document turned every number into a string, so a numeric default produced a generated unit that did not compile, and the converted document was not valid OpenAPI 3.0. A Swagger 2.0 discriminator, which is a string, aborted the whole parse with an invalid typecast.
- FixedFixed Bug OpenAPI Parser: a member with an unexpected JSON type, for example "properties": [] or "servers": ["https://api"], aborted the parse with an invalid typecast instead of being skipped.
- FixedFixed Bug OpenAPI Parser: a schema of type integer with no default was given a default of 0, and a single valued enum was treated as a const, which removed the parameter from the generated method altogether.
- FixedFixed Bug OpenAPI Parser: the default response and the ranged responses 2XX, 4XX and 5XX were silently dropped, so an API that declares its errors only with default generated a client with no typed error at all. When several successful responses are declared the lowest one is now used, and application/json is preferred when several media types are declared.
- FixedFixed Bug OpenAPI Parser: allOf kept only the last of several base schemas and discarded the members of the others, oneOf merged every branch into one class and produced duplicate fields, anyOf was not handled at all and resolved to a string, and a schema declaring both properties and additionalProperties lost all its properties.
- FixedFixed Bug OpenAPI Parser: the generated enum tables contained the sanitized identifier instead of the value the server expects, so for example allow-all was written as allowall and json-file as jsonfile. The declaration order of the specification is now kept, integer enums also get a table, and an extra Unknown member is generated so a value added later by the server does not silently become the first member.
- FixedFixed Bug OpenAPI Parser: an external reference with a JSON Pointer fragment such as ./common.yaml#/components/schemas/Error could not be resolved, two files referencing each other crashed the parser, a relative reference inside a sub document was resolved against the root document instead of its own, two external files with the same name silently overwrote each other and could replace a schema of the main document, and a chain of references was only followed one step.
- FixedFixed Bug OpenAPI Parser: bundling a specification overwrote the input file with no backup and no message, and deleted every typographic apostrophe from the whole document.
- FixedFixed Bug OpenAPI Parser: an external reference could read any file on the machine, for example ../../../credentials.json, and the contents were copied into the generated unit. External references are now confined to the directory of the main document, with a new option to allow more when it is really needed.
- FixedFixed Bug OpenAPI Parser: a specification stored in a path containing a space, for example C:\My Specs\, could not resolve its external references.
- FixedFixed Bug OpenAPI command line: the documented -output switch wrote the generated unit to a file called "utput" in the current directory, and because every message was suppressed the run looked successful. The -x switch also matched other switches beginning with x, such as -xml.
- FixedFixed Bug OpenAPI command line: nothing at all happened when the tool ran with no console attached, for example from a scheduled task or a build agent, and an existing output redirection was discarded.
- FixedFixed Bug OpenAPI command line: -h printed a licence error instead of the usage text on a machine that was not activated, an invalid value for -m or -a was accepted silently, and an unknown switch was ignored.
- FixedFixed Bug OpenAPI Parser: the generated unit was named after the input file instead of the output file, so generating MyClient.pas from petstore.json produced a unit called petstore that did not compile.
- FixedFixed Bug OpenAPI Parser: info.contact and info.license were never read because of a test that could never be true.
- FixedFixed Bug OpenAPI Parser: a server URL with several variables substituted the wrong value, and could raise a list index error.
- FixedFixed Bug OpenAPI Parser: reading the same document twice duplicated every path, tag, server and schema.
- FixedFixed Bug OpenAPI Parser: a specification extension such as x-tagGroups placed among the paths or the responses was read as if it were a path or a response.
- FixedFixed Bug OpenAPI Parser: enum, required and tags were parsed with a comma separated text helper, so a value containing a JSON escape or a comma was split or corrupted.
- FixedFixed Bug OpenAPI Parser: a security requirement listing several schemes kept only the first one, so the requirement that all of them are satisfied was lost.
- FixedFixed Bug OpenAPI Parser: a response whose schema referenced a top level array component generated a call that did not compile.
- FixedFixed Bug OpenAPI Parser: the generated file is now written with an explicit encoding, and a character that cannot be represented is reported instead of being silently replaced by a question mark.
- BreakingOpenAPI Client: the generated clients now verify the certificate of the server they connect to. They did not before, which means they accepted any certificate, including one presented by a man in the middle. To connect to a self signed or test endpoint set TLSOptions.VerifyCertificate to False. Note the certificates are trusted through the OpenSSL default paths, so a machine with no certificate store configured needs TLSOptions.RootCertFile.
- BreakingOpenAPI Client: the request body is now encoded as UTF-8 by default, as required by RFC 8259, and a class now serializes an empty string as "field": "". Set JSONIgnoreEmptyStrings to True for the previous output. Null values are controlled separately with JSONIgnoreNullValues.
- BreakingOpenAPI Client: a response no longer frees a ResponseStream supplied by the caller. Set OwnsResponseStream to True for the previous behaviour. Freeing the client from inside its own OnResponse, OnError or OnCancel handler now raises a clear error instead of hanging.
- BreakingOpenAPI command line: a switch value must now be written as -name value or -name:value. The appended form without a separator, such as -x"GET /pets", is no longer accepted.
- BreakingOpenAPI Parser: a parameter declared as an array is now generated as an array instead of a string, so the signature of the generated method changes for those operations.