
Orval
FreeGenerate type-safe API clients from OpenAPI specs.
Free · Opens the source repo
What Orval does
Orval is a powerful tool designed for developers who need to generate type-safe TypeScript clients, hooks, schemas, mocks, and server handlers directly from OpenAPI v3 or Swagger v2 specifications. By automating the generation of these components, Orval streamlines the process of integrating APIs into applications, ensuring that the generated code adheres to the specifications provided. This helps eliminate common errors associated with manual coding, improving both development speed and reliability.
The setup process for Orval is straightforward. After installation, developers can define a minimal configuration to specify the target OpenAPI specification and the desired output files. Orval supports various client types, including TanStack Query for React, Vue, Svelte, Solid, and Angular, as well as custom HTTP clients like Axios and Fetch. This flexibility allows developers to choose the best tools for their specific projects while maintaining type safety throughout.
Orval also offers advanced configuration options, allowing users to customize input and output settings, manage authentication headers, and apply transformations to the OpenAPI spec before generation. This level of customization is particularly beneficial for larger applications with complex API requirements, where precise control over the generated code is necessary. Additionally, features like mock generation for testing and support for various output modes (single, split, tags-split) further enhance its utility.
In summary, Orval is an essential tool for developers looking to efficiently generate and manage type-safe API interactions in their TypeScript applications. Its comprehensive support for different frameworks and advanced configuration capabilities make it suitable for a wide range of projects, from small applications to large-scale enterprise solutions.
When to use it
Use Orval when you need to quickly generate API clients and schemas from OpenAPI specifications, especially in TypeScript projects.
When not to use it
Orval may not be suitable for projects that do not use TypeScript or do not rely on OpenAPI specifications for API definitions.
What you can build with it
Generating API Clients for a React App
Use Orval to quickly generate a type-safe API client for your React application using the TanStack Query hooks.
Creating Zod Schemas for Validation
Leverage Orval to generate Zod schemas from your OpenAPI specs, ensuring your data validation is type-safe.
Mocking API Responses for Testing
Utilize Orval to create MSW mocks for your API, facilitating easier testing of your application without relying on live data.
How to install Orval
View source1. Install with the skills CLI
npx skills add orval-labs/orval/orval --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by orval-labsOrval - OpenAPI to TypeScript Code Generator
Orval generates type-safe TypeScript clients, hooks, schemas, mocks, and server handlers from OpenAPI v3/Swagger v2 specifications.
Quick Start
Installation
npm install orval -D
# or yarn add orval -D
# or pnpm add orval -D
# or bun add orval -D
Minimal Configuration
import { defineConfig } from 'orval';
export default defineConfig({
petstore: {
input: {
target: './petstore.yaml',
},
output: {
target: './src/api/petstore.ts',
schemas: './src/api/model',
client: 'react-query',
},
},
});
Run
npx orval
npx orval --config ./orval.config.ts
npx orval --project petstore
npx orval --watch
Choosing Your Setup
Client Selection Guide
| Use Case | Client | httpClient | Notes |
|---|---|---|---|
| React with server state | react-query | fetch or axios | TanStack Query hooks |
| Vue 3 with server state | vue-query | fetch or axios | TanStack Query for Vue |
| Svelte with server state | svelte-query | fetch or axios | TanStack Query for Svelte |
| SolidJS standalone app | solid-query | fetch or axios | TanStack Query for Solid |
| SolidStart full-stack | solid-start | native fetch | Uses query()/action() primitives |
| Angular with signals | angular-query | angular | Injectable functions, signal reactivity |
| Angular traditional | angular | — | HttpClient services |
| React with SWR | swr | fetch or axios | Vercel SWR hooks |
| Lightweight / Edge | fetch | — | Zero dependencies, works everywhere |
| Node.js / existing Axios | axios-functions | — | Factory functions (default) |
| Axios with DI | axios | — | Injectable Axios instance |
| Validation only | zod | — | Zod schemas, no HTTP client |
| Backend API server | hono | — | Hono handlers with Zod validation |
| AI agent tools | mcp | — | Model Context Protocol servers |
Mode Selection Guide
single— Everything in one file. Best for small APIs.split— Separate files:petstore.ts,petstore.schemas.ts,petstore.msw.ts. Good for medium APIs.tags— One file per OpenAPI tag + shared schemas. Organizes by domain.tags-split— Folder per tag with split files. Best for large APIs. Recommended.
httpClient Option
For react-query, vue-query, svelte-query, and swr clients:
output: {
client: 'react-query',
httpClient: 'fetch', // 'fetch' (default) | 'axios'
}
For angular-query:
output: {
client: 'angular-query',
httpClient: 'angular', // Uses Angular HttpClient
}
Configuration Reference
Config Structure
import { defineConfig } from 'orval';
export default defineConfig({
[projectName]: {
input: InputOptions,
output: OutputOptions,
hooks: HooksOptions,
},
});
Multiple projects can share the same config file with different input/output settings.
Input Options
input: {
target: './spec.yaml', // Path or URL to OpenAPI spec (required)
override: {
transformer: './transform.js', // Transform spec before generation
},
filters: {
mode: 'include', // 'include' | 'exclude'
tags: ['pets', /health/], // Filter by OpenAPI tags
schemas: ['Pet', /Error/], // Filter by schema names
},
parserOptions: {
headers: [ // Auth headers for remote spec URLs
{
domains: ['api.example.com'],
headers: {
Authorization: 'Bearer YOUR_TOKEN',
'X-API-Key': 'your-api-key',
},
},
],
},
}
Output Options
output: {
target: './src/api/endpoints.ts', // Output path (required)
client: 'react-query', // Client type (see table above)
httpClient: 'fetch', // 'fetch' (default) | 'axios' | 'angular'
mode: 'tags-split', // 'single' | 'split' | 'tags' | 'tags-split'
schemas: './src/api/model', // Output path for model types
operationSchemas: './src/api/params', // Separate path for operation-derived types
workspace: 'src/', // Base folder for all files
fileExtension: '.ts', // Custom file extension
namingConvention: 'camelCase', // File naming: camelCase | PascalCase | snake_case | kebab-case
indexFiles: true, // Generate index.ts barrel files
clean: true, // Clean output before generating
prettier: true, // Format with Prettier
biome: true, // Format with Biome
headers: true, // Generate header parameters
baseUrl: '/api/v2', // API base URL
// or from spec:
// baseUrl: { getBaseUrlFromSpecification: true, index: 0, variables: { environment: 'api.dev' } },
mocks: true, // Generate MSW + Faker mocks (boolean, object, or function)
docs: true, // Generate TypeDoc documentation
// docs: { configPath: './typedoc.config.mjs' },
allParamsOptional: true, // Make all params optional (except path params)
urlEncodeParameters: true, // URL-encode path/query parameters
optionsParamRequired: false, // Make options parameter required
propertySortOrder: 'Specification', // 'Alphabetical' | 'Specification'
tsconfig: './tsconfig.json', // Custom tsconfig path
override: { ... }, // Advanced overrides (see below)
}
Multiple API Specs
export default defineConfig({
petstoreV1: {
input: { target: './specs/v1.yaml' },
output: { target: 'src/api/v1', client: 'react-query' },
},
petstoreV2: {
input: { target: './specs/v2.yaml' },
output: { target: 'src/api/v2', client: 'react-query' },
},
});
Filter Endpoints
input: {
target: './spec.yaml',
filters: {
mode: 'include',
tags: ['pets'],
},
}
Detailed Guides
When the user's question involves a specific topic below, read the corresponding file from this skill's directory.
| Topic | File | Load when user asks about... |
|---|---|---|
| TanStack Query / SWR | tanstack-query.md | React Query, Vue Query, Svelte Query, Solid Query, SWR, query hooks, invalidation, infinite queries, suspense, prefetch |
| Angular | angular.md | Angular Query, Angular HttpClient, signals, inject functions, Angular services, providedIn |
| SolidStart | solid-start.md | SolidStart, @solidjs/router, query(), action(), createAsync, revalidate |
| Custom HTTP / Auth | custom-http-clients.md | Custom mutator, authentication, tokens, interceptors, custom fetch/axios, baseURL, hook-based mutator |
| Zod Validation | zod-validation.md | Zod schemas, validation, runtime validation, coerce, strict, preprocess |
| Mocking / MSW | mocking-msw.md | MSW mocks, testing, test setup, faker, Vitest, mock handlers, useExamples |
| Hono Server | hono.md | Hono handlers, zValidator, composite routes, context types, server-side generation |
| Advanced Config | advanced-config.md | Type generation, enums, per-operation overrides, FormData, JSDoc, params serializer, full example |
| Tooling / Workflow | tooling-workflow.md | Programmatic API, transformers, hooks, NDJSON streaming, MCP, afterAllFilesWrite |
OpenAPI Specification Best Practices
- Use unique
operationIdfor every operation — Orval uses these for function and hook names - Define reusable schemas in
components/schemas— reduces duplication in generated types - Use tags to group operations — works with
tagsandtags-splitmodes - Define response types for all operations — enables full type safety
- Mark required fields — affects optional/required in generated TypeScript interfaces
- Use
x-enumNamesfor numeric enums — generates readable const names - Provide
examplevalues — used by mock generation whenuseExamples: true - Use
application/x-ndjsoncontent type for streaming endpoints — enables typed NDJSON generation
CLI Reference
orval # Generate using auto-discovered config
orval --config ./api/orval.config.ts # Specify config file
orval --project petstore # Run specific project(s)
orval --watch # Watch mode
orval --watch ./src # Watch specific directory
orval --clean # Clean generated files
orval --prettier # Format with Prettier
orval --biome # Format with Biome
orval --tsconfig ./src/tsconfig.json # Custom tsconfig path
orval --mode split # Override output mode
orval --client react-query # Override client
orval --mock # Override mock generation
orval --input ./spec.yaml --output ./api.ts # Direct generation
Resources
Frequently asked questions about Orval
Similar skills
Rhino 3D Scripting
Streamline your Rhinoceros 3D scripting tasks.
MVVM Toolkit
Streamline ViewModel development with source generators.
FreeCAD Scripts
Generate Python scripts for FreeCAD automation and modeling.
Azure Architecture Builder
Design and deploy Azure infrastructure using natural language.
Command Development
Streamline your command creation for Claude Code.
Create Cowork Plugin
Easily build and package plugins through guided sessions.
