Client shape
Client shape is what a caller actually types. These settings decide whether your SDK reads like client.users.list() or listUsers(), and whether arguments arrive as an object or positionally.
You'll find them in SDK Studio → Customize SDK Features. Each one shows a live code preview, so you can see the effect before you build.
Client style
Client style and Namespace together decide the top-level surface. These four shapes are from generated TypeScript.
import { Acme } from "acme-api";
const client = new Acme({ auth: { bearer: process.env.API_TOKEN! } });
const user = await client.users.get({ id: "usr_1" });A client you create, with operations grouped by resource. The default, and the surface most widely used SDKs ship. Set Client style to class-based and Namespace to tags or path.
Both function styles share one configuration across the process. A caller who talks to two accounts or two environments at once needs a client they can create twice.
Namespace
Namespace decides how operations are grouped once the surface is namespaced.
| Option | Result |
|---|---|
tags | Group by your OpenAPI tags. users.list(). The default |
path | Group by URL path segments. api.users.list() |
none | No grouping. Every operation is a top-level call |
Tags are authored deliberately; paths are an accident of routing. If your spec tags its operations, tags gives better group names. path is the fallback when tags are sparse.
Method naming
Method naming only matters under a namespace.
| Option | Result |
|---|---|
short | Strips the namespace word so it isn't repeated. getUser tagged users becomes users.get(). The default |
full | Keeps the operation ID intact. users.getUser() |
Reach for full when your operation ids are already well named and stripping them loses meaning.
Every naming setting here is downstream of the operationId in your spec, so a clear, verb-first id is worth more than any option on this page. Ten habits for writing great OpenAPI specs starts there.
Argument style
Argument style decides how parameters reach a method.
await client.users.get({ id: "usr_1" });All arguments in one options object. Self-documenting, order-free, and adding an optional parameter later isn't a breaking change. The default for TypeScript and Java; the other languages default to positional, where a wide operation is promoted to a request object automatically so you only pay for the ceremony where it buys something.
Folder structure
Folder structure decides how generated source is laid out on disk. It changes nothing at the call site, only what someone reading the SDK repo sees.
| Option | Layout |
|---|---|
flat | One source directory, with methods grouped into resource modules |
tags | A folder per OpenAPI tag. The default |
path | A folder per URL path segment |
Default headers
Some APIs refuse a request without a fixed header, such as an API version. Add these under Headers in the SDK settings, and every generated client sends them on every request, in all ten languages.
A header set by the caller or by the endpoint takes priority over a default header of the same name.
Anyone who installs the SDK can read these values, so don't use them for secrets. Authorization, Proxy-Authorization and Cookie aren't accepted here. Set up authentication for credentials instead.
Apply to every language
Most of these settings can differ per language, and Studio has an Apply to every language control next to each one.
Client style and namespace usually want to be consistent across languages so your docs and examples match. HTTP engine and data-model style are language-specific by nature and shouldn't be forced.
Precedence is narrowest-first: a per-endpoint override beats a per-language setting, which beats the project default.
Per-endpoint overrides
Selecting an endpoint in Studio gives you controls that apply to just that method:
Output detail
Three settings control how much the generated source explains itself.
Doc commentschoice per languagefull documents every method and field, which powers editor tooltips. minimal makes leaner files.
outputByLang.<language>.docComments
File headerchoiceinclude marks every file with a DO NOT EDIT banner. omit removes it, and needs the Enterprise plan.
Keep it on when the SDK lives in a repo where someone might try to hand-edit it. Go's tools also recognize the banner as marking generated code.
fileHeader
Usage examplechoice per languagefull shows setup and the call in generated samples. concise shows the call alone.
outputByLang.<language>.usageExample
From the CLI
octri sdk settings set clientStyle functions changes one value. The keys are in the settings reference, and the command in SDK commands.