One OpenAPI spec, eight idiomatic SDKs — TypeScript, Python, Go, Java, Kotlin, Ruby, C# and PHP — perfectly typed, automatically released, shipped the same day your API does.
Push a change to your openapi.yaml. Stainless regenerates every SDK in under 90 seconds, opens a PR per language, runs the type-checker, and waits for your /approve. No hand-edits, no drift, no 2 a.m. release engineering.
Stainless ships the parts every SDK needs and most teams quietly cut. You inherit them on day one — in every language, identically.
Discriminated unions, generics, sealed classes — whatever the language idiom is, your IDE knows the shape of response.output the moment you handle the 200.
Builders in Java. Async iterators in TypeScript. context.Context first-arg in Go. Pythonic kwargs. Kotlin DSLs. Each SDK reads like it was hand-written by the team that wrote the language.
SemVer detection on every diff. CHANGELOG drafted from your spec changes. PRs to npm, PyPI, Maven Central, pkg.go.dev, NuGet and RubyGems — all signed, all reproducible.
responses.tools[]The OpenAPI document is the single source of truth. Stainless reads it once and emits everything downstream — reference docs, integration guides, golden tests, even an MCP server that lets Cursor and Claude Code call your API safely.
Stainless owns the API reference. You author the prose. Both ship from the same git repo with version branches, Algolia search, custom domain and AI chat baked in.
Token-efficient tool definitions, scoped auth, paginated results. Your customers' agents never burn context discovering your API.
Recorded against a mock server, replayed on every PR. Catches drift before npm sees it.
A removed enum value or a tightened required field bumps you to a major release — with the migration guide drafted.
model_v1Every endpoint in your spec has a generated test, a doc page, and an SDK method — or you get a PR explaining why.
Pick any file in the generated SDK on the right. The OpenAPI fragment that produced it stays pinned on the left. Audit the whole pipeline without leaving a single screen.
The honest matrix — where the open-source generator wins, where hand-written wrappers win, and where Stainless earns the line item.
| Stainless/ managed | swagger / openapi-generator/ open source | Hand-written SDK/ in-house | |
|---|---|---|---|
| Idiomatic per language | ● Yes — per-lang specialists | ◐ Templated — reads generated | ● Yes — if you staff for it |
| Type-narrowed by status code | ● Yes — discriminated unions | ○ No — one return type | ◐ If you wrote it that way |
| Streaming, retries, pagination | ● Built-in, all 8 langs | ○ Manual per language | ◐ Hand-rolled, drifts over time |
| SemVer + auto changelog | ● Drafted from spec diff | ○ You write it | ○ You write it |
| Publish to npm/PyPI/Maven/… | ● Signed releases, all registries | ◐ CI you maintain | ◐ CI you maintain |
| Docs co-generated & in sync | ● Reference + handwritten, one repo | ○ Separate tool | ○ Separate tool |
| MCP server for agent use | ● One-click, scoped auth | ○ Not supported | ○ Build it yourself |
| Time to first published SDK | ● Day 1, 8 languages | ◐ Week 1, 1 language well | ○ Quarter 1, 1 language |
| Total cost of ownership / yr | ~$6K–$60K, 1 generator | ~$280K, 1.5 SDK engineers | ~$1.4M, 5+ SDK engineers |
Start free, upgrade when you ship to production. Volume discounts kick in at three generators — the second SDK in the same org is always 30% off.
Six interviews with current customers, lightly edited. The full quotes — and the engineers' contact details for reference checks — are available on request.
If your question isn't here, email hi@stainless.com — a real engineer replies, in our experience under four hours during US/EU business days.
extras/ directories that survive every regen. On Pro you get up to 10,000 lines; on Enterprise the limit is removed. Custom helpers, ergonomic shortcuts, framework adapters — ship them and forget about merge conflicts.Free up to five generators. No card. No sales call. The same build pipeline that powers OpenAI, Anthropic and Cloudflare — pointed at your openapi.yaml.