Skip to content

Target Languages

The targets section specifies which languages to generate SDKs for and their language-specific configuration.

LanguageStatusPackage Manager
TypeScriptSupportednpm
PythonSupportedpip/poetry
JavaSupportedMaven/Gradle
GoPreviewgo modules
C#SupportedNuGet
PHPPlannedComposer
RubyPlannedRubyGems

Generate SDKs with default settings:

targets:
- typescript
- python
- go
- java

Specify language-specific options:

targets:
typescript:
package_name: "@acme/sdk"
module_format: esm
generator_version: "0.1.0"
python:
package_name: acme-sdk
min_version: "3.9"
generator_version: "0.3.0"
java:
group_id: com.acme
artifact_id: acme-sdk
generator_version: "0.2.0"
go:
module: github.com/acme/sdk-go
generator_version: "0.1.0"
csharp:
package_id: Acme.Sdk
root_namespace: Acme.Sdk
target_frameworks: [netstandard2.0, net8.0, net9.0]
generator_version: "0.1.0"
targets:
typescript:
package_name: "@acme/sdk" # npm package name
module_format: esm # Module format: esm or cjs
generator_version: "0.1.0" # Pin the TypeScript generator version
OptionDefaultDescription
package_namekebab-case of sdk.namenpm package name. Use a scoped name (e.g. @acme/sdk) for organization-scoped packages.
module_formatesmModule format (esm or cjs). Controls package.json#type and conditional exports.
generator_versionlatestPinned generator version (e.g. "0.1.0"). See Generator versioning.
targets:
typescript:
module_format: esm

Generates ES modules:

export { Client } from './client.js';
export type { User, UserCreate } from './types.js';
sdks/typescript/
├── src/
│ ├── client.ts
│ ├── resources/
│ │ └── users.ts
│ └── types/
│ └── index.ts
├── package.json
├── tsconfig.json
└── README.md
targets:
python:
package_name: acme-sdk # PyPI package name
min_version: "3.9" # Minimum Python version
generator_version: "0.3.0" # Pin the Python generator version
OptionDefaultDescription
package_namesdk.name (snake_case)PyPI package name
min_version"3.8"Minimum Python version
generator_versionlatestPinned generator version (e.g. "0.3.0"). See Generator versioning.
sdks/python/
├── acme_sdk/
│ ├── __init__.py
│ ├── client.py
│ ├── resources/
│ │ └── users.py
│ └── types/
│ └── __init__.py
├── pyproject.toml
├── setup.py
└── README.md
targets:
python:
min_version: "3.9" # Requires Python 3.9+
targets:
go:
module: github.com/acme/sdk-go # Go module path
generator_version: "0.1.0" # Pin the Go generator version
OptionDefaultDescription
modulegithub.com/org/sdk.nameGo module path
generator_versionlatestPinned generator version (e.g. "0.1.0"). See Generator versioning.
sdks/go/
├── client.go
├── resources/
│ └── users.go
├── types/
│ └── types.go
├── go.mod
├── go.sum
└── README.md

Go uses exported (capitalized) names:

// Generated Go code
client.Users.List(ctx)
client.Users.Get(ctx, "user-123")
client.Users.Create(ctx, UserCreate{Name: "John"})
targets:
java:
group_id: com.acme # Maven group ID
artifact_id: acme-sdk # Maven artifact ID
generator_version: "0.2.0" # Pin the Java generator version
OptionDefaultDescription
group_idcom.exampleMaven group ID
artifact_idsdk.nameMaven artifact ID
generator_versionlatestPinned generator version (e.g. "0.2.0"). See Generator versioning.
sdks/java/
├── src/main/java/com/acme/sdk/
│ ├── Client.java
│ ├── resources/
│ │ └── Users.java
│ └── types/
│ └── User.java
├── pom.xml
├── build.gradle
└── README.md

Soxom generates configuration for both Maven and Gradle:

pom.xml
<groupId>com.acme</groupId>
<artifactId>acme-sdk</artifactId>
<version>1.0.0</version>
targets:
csharp:
package_id: Acme.Sdk # NuGet package ID
root_namespace: Acme.Sdk # Root C# namespace
target_frameworks: [netstandard2.0, net8.0, net9.0] # Multi-target TFMs
generator_version: "0.1.0" # Pin the C# generator version
OptionDefaultDescription
package_idPascalCase form of sdk.nameNuGet package ID (e.g. Acme.Sdk). PascalCase is recommended; dotted segments map to namespace levels.
root_namespacesame as package_idRoot C# namespace for emitted types.
target_frameworks[netstandard2.0, net8.0, net9.0]Target framework monikers to publish. The generated SDK is multi-targeted; netstandard2.0 covers downstream consumers on .NET Framework / Mono / Xamarin while net8.0 + net9.0 enable AOT and trimming on modern .NET.
generator_versionlatestPinned generator version (e.g. "0.1.0"). See Generator versioning.
sdks/csharp/
├── src/
│ ├── AcmeSdkClient.cs
│ ├── Resources/
│ │ └── UsersResource.cs
│ ├── Models/
│ │ └── User.cs
│ └── Serialization/
│ └── SoxomJsonContext.cs
├── Acme.Sdk.csproj
└── README.md

The emitted SoxomJsonContext is a JsonSerializerContext source-generated for every model — the SDK is trim-safe and AOT-compatible on net8.0 / net9.0 out of the box.

version: "1.0"
sdk:
name: acme-platform-sdk
version: 1.0.0
description: Official SDK for Acme Platform API
spec:
path: ./openapi.yaml
targets:
typescript:
package_name: "@acme/platform-sdk"
module_format: esm
generator_version: "0.1.0"
python:
package_name: acme-platform-sdk
min_version: "3.9"
generator_version: "0.3.0"
java:
group_id: com.acme.platform
artifact_id: platform-sdk
generator_version: "0.2.0"
go:
module: github.com/acme/platform-sdk-go
generator_version: "0.1.0"
csharp:
package_id: Acme.Platform.Sdk
root_namespace: Acme.Platform.Sdk
target_frameworks: [netstandard2.0, net8.0, net9.0]
generator_version: "0.1.0"

Each language’s generator is versioned independently. The generator_version field on a target pins which version of that generator produces the SDK. Omit it to track the latest stable generator for the language.

Pinning keeps spec changes and generator changes on separate axes — a spec-only change produces a spec-only diff in the Staging Release, instead of mixing in unrelated generator drift. See Generator versioning for the full story, including upgrade guidance and notes on the Go preview generator.

Generated SDKs are committed to a managed Staging Repository per SDK Target — there’s no local output path to configure.

Each SDK Target is an independent resource with its own build queue. When you push to the Config Repository, only targets whose config or pinned generator version changed will rebuild; the others stay on their existing Staging Release. There’s no build-time target selection — what builds is determined by what changed.