Orval vs Kubb for the Sume OpenAPI spec: which generator fits
Orval centers on one client style per config; Kubb composes plugins on one parsed spec. Compare how each handles Sume's 3.0.3 document, jobs and polling hooks.

The answer
Choose Orval when you want one configured client style, such as react-query with split files, from the Sume spec. Choose Kubb when you want to mix outputs, for example types plus Zod validators plus SWR hooks plus MSW mocks, from one parsed document. Both read Sume's OpenAPI JSON; neither changes how you must handle async jobs.
Everything below comes from each tool's own home page. Neither page makes a claim about Sume, so the mapping to Sume is ours.
What each page says
Orval's page shows a config object with output.mode, output.client and input.target, and describes generating one custom hook per path. Kubb's page describes an adapter that parses a spec into a shared AST and a list of plugins, run with npx kubb generate.
| Aspect | Orval | Kubb |
|---|---|---|
| Setup | defineConfig in orval.config.ts | npx kubb generate |
| Output style | Client chosen in config, e.g. react-query | Plugins: TS, Axios, Fetch, React Query, Vue Query, SWR, Zod, Faker, MSW, MCP |
| File layout | mode tags-split | Barrel plugin available |
| Mocks | mock option shown in the example config | Faker and MSW plugins |
How that plays with Sume
Sume's document is OpenAPI 3.0.3 with 183 operations and nullable fields. For a React app that only needs typed hooks, Orval's single client option is the shortest path. For a service that wants validated payloads at the edge, Kubb's Zod plugin is the closer fit.
In both cases the job flow is yours to write. A create returns a job; you poll status_url until terminal is true, wait at least next_poll_after_seconds between reads, and fetch result_url when result_ready is true. Generated code gives you the calls and types, not that loop.
Questions to settle first
Decide whether you need runtime validation, whether you want mocks for tests, and whether you target one framework or several. If you need none of the extras, a types-only generator may be enough; see the client guide for the options.
Whatever you pick, commit the spec copy you generated from and send Idempotency-Key on every create, since generators do not add it for you.
A rule of thumb
Small team, one front end, one data library: Orval. Several consumers, validation at the edge, mocks in tests: Kubb. Either way, keep the generated tree out of hand edits, regenerate from a committed copy of the spec, and put the job loop and the idempotency key in a thin wrapper that you own and test.
If you are unsure, generate with both for one tag, such as Jobs, and compare the files. The cost of trying is one config file each, and the difference in output is easier to judge on real code than from a feature table.
Sources
Related posts
More in Comparisons
- Otter Pro 1,200 minutes at $16.99 vs Sume STT at $0.01 a minute
Otter Pro lists 1,200 monthly minutes for $16.99 a month. The same 1,200 minutes through Sume STT cost $12.00. What each includes and where each one limits you.
- Outfit reveal clip: Seedance 2.5 or Gemini Omni Flash 1.1 on Sume?
Pick the Sume video model for a try-on or outfit reveal by the limits that matter: duration, resolution, references, audio and aspect ratio.
- Plainly 50 minutes for $48 vs Sume Timeline at $0.10 a minute
Plainly Starter lists 50 export minutes for $48 a month billed yearly, about $0.96 a minute. Sume renders an output minute for $0.10. Reel math for 3 minutes.
- Pocket TTS voice cloning: a wav in, and what Sume does instead
Pocket TTS clones from a wav file you pass to --voice, with consent rules in its model card. Sume's API takes voice ids, not audio. Here is the difference.
Written by Sume