Specs

Local and remote OpenAPI specs, and the options that shape each one.

Specs

A spec entry is either a filename in public/openapi/ or an http(s) URL. Strings work when you need no options; use the object form to shape how a spec renders.

"specs": [
  "simple.json",
  { "spec": "payments.json", "useFirstTagOnly": true },
  { "spec": "https://example.com/checkout-v70.json" }
]

Local vs remote

Local files live in public/openapi/ and version with your docs — predictable and reviewable. Remote URLs are fetched by fiskil openapi fetch (run automatically before dev and build) and cached under public/openapi/_remote/ with names suffixed by a hash of the URL, so two different URLs can even share a filename safely. Remote specs re-download only when missing or when you pass --force — a changed remote is not detected automatically, so refresh with fiskil openapi fetch --force; every spec, local or remote, is validated as parseable OpenAPI before the build proceeds.

Pin remote URLs to a version or commit (not a moving main) so your docs don't change under you between builds.

Per-spec options

OptionTypeEffect
useFirstTagOnlybooleanGroup each operation under its first tag only — the fix for specs that tag operations with both a resource and a version or audience tag
mergeAsstringCollapse every tag into one sidebar category with this label — for small specs that don't need categories
categoryOrderstring[]Pin these categories first, in this order; unlisted ones follow
sectionstringPlace all of this spec's categories under a labeled sidebar section (a ---Label--- from your meta.json)
sectionByTagobjectRoute operations carrying a given tag into a section — and stop that tag being a category itself

The last two are the bridge between generated categories and your hand-authored sidebar structure — see Endpoint pages for the full picture.

How categories form

Operations group by tag into sidebar categories. Version-shaped tags (v3, v1.2) are ignored as categories, names are prettified (camelCase and dashes become words, short acronyms stay uppercase), duplicate operations de-duplicate by operationId, and operationIds carrying # separators become clean, stable page slugs automatically. A spec with no usable tags renders as a single "Uncategorized" group (give it mergeAs for a better label).