Generate HTTP client code from any OpenAPI doc.
Drop-in code generation for 21 languages and 41 language/client combinations. Browser-compatible, zero runtime dependencies, with a plugin system for custom generators.
Generate code in three lines
import { generate } from "@powerduck/openapi-codegen"; const document = { openapi: "3.1.0", info: { title: "Demo API", version: "1.0.0" }, servers: [{ url: "https://api.example.com/v1" }], paths: { "/users/{id}": { get: { operationId: "getUser", parameters: [{ name: "id", in: "path", required: true, schema: { type: "string" } }], responses: { "200": { description: "OK" } }, }, }, }, }; // Full GenerateOptions — all fields shown const code = generate({ document, // OpenAPI document (required if no request) path: "/users/{id}", // Operation path method: "get", // HTTP method language: "python", // Target language (required) client: "requests", // HTTP client (required) serverUrl: "https://api.example.com/v1", // Override servers[0].url securityValues: { bearerAuth: "my-token" }, // Auth values softRefMode: false, // Soft $ref resolution }); console.log(code);
Everything you need for code generation
Built for API documentation, SDK scaffolding, and developer tooling.
21 Languages, 41 Clients
TypeScript fetch/axios/node, Python requests/httpx/aiohttp, Go net/http/fasthttp, Java OkHttp/Unirest, Ruby, PHP, cURL, wget, and more.
Browser Compatible
Pure TypeScript with no Node.js dependencies. Runs in browsers, Edge Functions, Web Workers, and any modern JS runtime.
Zero Runtime Dependencies
No heavy dependencies shipped to your users. The entire generator compiles to a small, tree-shakeable ESM/CJS bundle.
Plugin System
Register custom generators with register() or
use(plugin). Extend or override any built-in
language without forking.
Accurate $ref Resolution
Properly resolves OpenAPI $ref pointers for request
bodies, parameters, and schemas. Handles circular references
safely.
Security Value Injection
Pass securityValues to inject API keys, bearer
tokens, and basic auth credentials directly into generated code.
21 languages out of the box
Call list() to get the full list of available
language/client pairs.
Complete API surface
Click any entry to expand parameters and examples.
| Parameter | Type | Description |
|---|---|---|
| options.document | object |
OpenAPI document object (required when no
request)
|
| options.path | string |
Operation path, e.g.
"/users/{id}" (required with document)
|
| options.method | string | HTTP method lowercase: get, post, put, delete, patch (required with document) |
| options.languagerequired | string | Target language, e.g. "python" |
| options.clientrequired | string | HTTP client, e.g. "requests" |
| options.request | RequestIR | Pre-normalized request (skips document lookup) |
| options.serverUrl | string | Override server base URL |
| options.securityValues | object | Map of security scheme names to values |
| options.softRefMode | boolean | Graceful $ref resolution mode |
| Parameter | Type | Description |
|---|---|---|
| generator.languagerequired | string | Language identifier |
| generator.clientrequired | string | Client identifier |
| generator.generaterequired | (req: RequestIR) => string | Generation function |
Generator | undefined
Array<{ language: string; client: string }>
| Parameter | Type | Description |
|---|---|---|
| plugin.registerrequired | (ctx: { register }) => void | Plugin registration hook |
Idempotent. Safe to call multiple times; only registers on first invocation.
Exported from the package root. Includes document, path, method, language, client, request, serverUrl, securityValues, softRefMode.
{ language: string; client: string; generate: (request: RequestIR) => string }