Generate beautiful API references from OpenAPI documents
Last release today
28 Aug 2026
Ships on a steady schedule
a new release about every 1 weeks
Most releases are documented
notes for 51 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
3 years old
705 releases · first in 2023
Release timeline
705 releases since 2023One column per quarter.
Releases
- 1.67.028 Aug 2026
Release notes
Open source →Minor Changes
-
#10043: Resolve heading levels from a block's place in the page outline instead of hardcoding them, so a block rendered on its own starts at
h1.A block now assumes it is the top of the page: rendered alone, an operation's title is the
h1and everything it contains follows beneath it. A component that renders several blocks alongside each other owns the relationship between them and anchors the outline —Contentrenders the info block above the tags and operations, so it declaresdocumentand the rest resolve against it. Composed into a full reference, every heading renders at the level it always has.Also fixes two headings that never went through the heading components: the classic-layout operation title was a raw
h3, and the classic-layout Models section label passed alevelprop to a component that does not accept one, so it rendered no heading element at all. -
feat: test OpenAPI webhooks from the API reference and API client
Patch Changes
- #9983: Bump the
zodcatalog to^4.4.3so the standalone bundle ships a singlezodinstead of two (4.3.5from@scalar/typesplus4.4.3from theai/@ai-sdkpeer). This makesstandalone.js~68KB raw / ~18KB gzip smaller. - #9965: Fix oneOf selector labels showing the shared allOf base name instead of the variant's own name. When a oneOf branch extended a common base through a single-
$refallOf (a common inheritance pattern), flattening that allOf for display left the base schema's own identity ($ref,title, orname) on the flattened variant, so the selector picked up the base's name for every branch instead of each branch's own name. - #9973: Fix the "OAuth scopes" section rendering for any security scheme with a non-empty scope array, including
httpandapiKeyschemes. Scopes are only meaningful foroauth2andopenIdConnectschemes, so the section is now skipped when the resolved scheme is of a different type. - #9289: fix response example panel to reflect selected content type from the response dropdown
- #9968: Move the schema
Patternhover chip next to theExamplechip so it no longer collides with the preceding constraint (for examplemax length: 26Pattern). Real constraints like length andnullablenow stay together in the dotted list.
-
- 1.66.120 Aug 2026
Release notes
Open source →Patch Changes
- #9941: Republish every package through npm trusted publishing. No functional changes.
- 1.65.113 Aug 2026
Nothing published for this version
- 1.65.013 Aug 2026
Release notes
Open source →Minor Changes
- #9884: Export the AsyncAPI content components (AsyncApiChannel, AsyncApiOperation, AsyncApiMessage, AsyncApiTraversedEntry) from
@scalar/api-reference/componentsso downstream renderers can render an individual channel/operation/message on its own page.
Patch Changes
- #9856: Render model names as plain text when there is no models section to link to. The names next to types and on the request body heading used to be links even when the whole models section was hidden via
hideModels, or when the referenced model itself was hidden viax-internal/x-scalar-ignore. There was nothing to scroll to, so clicking them did nothing. They now render as plain text in both cases. - #9858: Only render a clickable model name link when the
$refactually targets#/components/schemas/. Refs into other component buckets (parameters, responses, ...) or external files now show the name as plain text instead of a dead link that scrolls nowhere. - #9857: Fix dead model-name links for schemas grouped under a tag via
x-tags. The models index now collects model entries from the whole navigation tree, so clicking a model name that lives under a tag group scrolls to the model instead of doing nothing. - #9859: Fix empty popup when hovering the "Generate MCP" button without an MCP config
- #9862: Use the webhook icon for webhooks in search results so they are easy to tell apart from operations
- #9884: Export the AsyncAPI content components (AsyncApiChannel, AsyncApiOperation, AsyncApiMessage, AsyncApiTraversedEntry) from
- 1.64.17 Aug 2026
Release notes
Open source →Patch Changes
-
#9828: Bump shared build and runtime dependencies to their latest compatible versions (fuse.js, vite, vitest, tailwindcss, @vitejs/plugin-vue, @vue/test-utils, posthog-js, yaml, and the CSS injection plugin). The fuse.js 7.5.0 upgrade tightened generic inference, so the empty
new Fuse([])search instances now pass an explicitFuseDatatype argument. -
#9837: Keep the selected server when the configuration is updated. Pushing a config update to a mounted reference (for example a refreshed auth token via
updateConfiguration) rebases the document in the store, which previously reset the server selector back to the first server. The user's selected server is now preserved across configuration updates. -
#9783: fix: resolve axe-core ARIA violations in the API reference sidebar and client tabs
Sidebar items used
aria-selectedon links/buttons (invalid for those roles) and the search trigger usedrole="search"on a button. Selected items now usearia-current="page", the search control is a plain named button, and the sidebar no longer sets an invalidrole="navigation"on<aside>(it keeps the default complementary landmark).Client library and SDK installation "More" comboboxes sat inside
role="tablist", which failsaria-required-children. They now sit beside the tablist. MCP install controls without a target URL render as buttons instead of emptya[href=""]links. -
#9791: Stop recursive schema rendering when a discriminator variant
allOfs back to its base type. The selected child now inherits the parent's discriminator context so the mapping is not re-inferred on every nest. -
#9830: Stop listing enum values twice for an array parameter whose
itemsis a$refto an enum schema. The values are now listed only in the array items card, which also shows the item schema's title and description. -
#9839: Harden the API reference against untrusted OpenAPI documents:
- Link targets taken from the document (
info.license.url,info.termsOfService,info.contact.url,externalDocs.url,x-scalar-links) and the direct download link are now checked against an allow list of protocols, so a document can no longer render ajavascript:link that runs script when a reader clicks it. Unsafe values fall back to plain text. deepMerge(used by the exportedcreateEmptySpecification) no longer writes through the prototype chain, so a document can no longer add properties toObject.prototypevia__proto__,constructor, orprototype. Keys with those names are kept as plain data instead of being dropped, so a schema is still free to describe a property namedconstructor.customCsscan no longer close the injected<style>tag, which mattered during server rendering where the value lands in the HTML stream verbatim.- Added
rel="noopener noreferrer"to the remainingtarget="_blank"links.
Adds
isSafeUrlandsanitizeUrlto@scalar/helpers/url/is-safe-url. - Link targets taken from the document (
-
#9829: Update Vue to 3.5.40. Vue 3.5.36 tightened
defineModeldefault validation, so models with array or object defaults now use the factory form (defineModel<T[]>({ default: () => [] })) as Vue already requires for regular props. Behaviour is unchanged. -
#9790: fix: keep dots in webhook navigation deep links
Webhook event names that use dots (for example
account_holder.created) had the dot dropped when building the navigation id, joining adjacent words intoaccount-holdercreated. Dots are now kept, producingaccount-holder.created.Old deep links using the dropped-dot slug are redirected to the new slug, so existing bookmarks keep resolving.
-
- 1.64.031 Jul 2026
Release notes
Open source →Minor Changes
-
#9683: Surface the required OAuth scopes for an operation as a dedicated "OAuth scopes" section below the description (above parameters), instead of only inside the "Auth Required" badge popover. Scopes are de-duplicated across security alternatives and shown in both the modern and classic layouts, as well as on AsyncAPI operations.
-
#9711: feat: add
pluginUrlsconfiguration option to load API Reference plugins from URLsEach entry must point to an ESM module that exports a plugin (the same shape as the
pluginsentries) as its default export. The standalone build (Scalar.createApiReference) imports the modules before the API reference mounts and registers their default exports alongside the plugins passed directly. Unlikeplugins, the new option is JSON-serializable, so integrations that pass their configuration as JSON (for example the Docker container or Scalar for Aspire) can load plugins without replacing the whole bundle.
Patch Changes
-
#9732: Render every
oneOf/anyOfgroup of anallOfin place. Previously, when one object composed several mutually-exclusive choices as siblingoneOf/anyOfunderallOf, only the first group was shown and the rest were silently dropped. Each choice group now renders its own selector in the position it was declared, and the generated request example stays in sync per group. -
#9794: Keep sibling
propertieswhen flattening a single-memberallOf. Previously, a schema declaring its ownpropertiesnext to anallOfholding a single$reflost those sibling properties: the referenced schema'spropertiesoverwrote them instead of being combined, and the referenced schema'stitle/descriptionreplaced the parent's. Sibling and inherited properties now render together,requiredlists are unioned, and the parent schema's own annotations win over the base it extends. -
#9757: fix: read enum metadata from array items
When an enum is defined inside an array schema's
items, the enum values were resolved fromitemsbut theirx-enum-varnames,x-enumNames, andx-enumDescriptionswere still read from the outer schema, so the metadata was dropped. Both the values and their metadata are now read from the same schema. -
#9681: The "Auth Required" / "Auth Optional" badge on operations now opens on hover, not just on click
-
#9753: fix: badge base styles no longer rely on zero specificity
The badge base rule was written with
:where(.badge), which the scoped-style compiler collapsed to zero specificity, letting any late-loading reset clobber the badge font size, padding, and colors. The base styles now carry real specificity, and consumers that intentionally override them (the download-link json/yaml badges and the webhook badge) keep winning through tailwind-merge and higher-specificity variant rules. -
#9766: fix: give the collapsible section trigger an accessible name and a valid
aria-controlstargetThe trigger button rendered by
CompactSectioncarriedaria-controlsset to its ownid, so it declared that it controls itself, and it exposed no accessible name of its own. Screen reader users heard an unnamed button, and axe-core reportedbutton-nameandaria-allowed-attron every model section.The trigger now points
aria-controlsat the collapsible region, which carries its own id. While the section is collapsed the attribute is dropped entirely rather than left pointing at an element that is not rendered.The accessible name now comes from
aria-labelledbypointing at the heading the trigger already renders, so the name is always the visible text. Referencing the heading rather than copying it into anaria-labelmeans the name cannot drift out of sync with what is on screen, which is the WCAG 2.5.3 (Label in Name) failure a duplicated string would risk. -
#9754: fix: adapt the info links to the rendered width of the reference instead of the viewport
The introduction's info links (contact, license, terms of service, external docs, and
x-scalar-links), the section header grid, and the classic-layout selector cards switched their layout based on viewport media queries, while the rest of the reference adapts to the rendered width of the reference through thenarrow-references-containercontainer query. They now restyle based on the container as well, through a newnarrow:Tailwind variant. -
#9751: fix: keep even heading-to-description spacing on the operation title in narrow layouts
The narrow (single-column) operation layout bumped the operation title's bottom margin to 24px, so the gap between the heading and its description no longer matched the 12px used on wider screens. The override is removed so the title keeps the shared 12px spacing at every width.
-
#9676: Preload additional documents in a multi-document setup while the browser is idle, so switching between them is instant.
-
#9788: Add print styles so printing (or saving to PDF) no longer renders expanded content over the text that follows it. The reference lays itself out as a fixed-viewport application, and its sticky columns were pinned to a screen measurement that is meaningless on paper. Printing now flattens that shell into ordinary document flow: navigation and floating chrome are hidden, sticky positioning and viewport-derived height caps are dropped so long examples are no longer truncated, and small units such as properties and cards avoid breaking across pages.
-
#9691: Show the
formatof primitive array items (e.g. an array ofuuidstrings) in the schema property heading
-
- 1.63.020 Jul 2026
Release notes
Open source →Minor Changes
- #9728: feat: export
SdkInstallationInstructionsandgetRenderableSdksfrom@scalar/api-reference/blocks, so consumers that compose their own reference layout can renderx-scalar-sdk-installationagain
- #9728: feat: export
- 1.62.916 Jul 2026
Release notes
Open source →Patch Changes
- #9719: docs: update the Scalar platform overview block in the README
- 1.62.816 Jul 2026
Release notes
Open source →Patch Changes
-
#9687: feat(themes): derive the border radius scale from
--scalar-radiusThe radius tokens used to be independent, so setting
--scalar-radius: 0still left rounded corners behind on anything using--scalar-radius-lg,--scalar-radius-xlorrounded-full. They now all derive from--scalar-radius, which means overriding that single variable rescales every corner in the interface, and0squares it off completely.Two new tokens fill out the scale,
--scalar-radius-2xl(12px) and--scalar-radius-3xl(16px), along with--scalar-radius-fullfor pills and circles. The matchingrounded-2xlandrounded-3xlTailwind utilities now emit CSS; previously they were silently dropped.Every default value is unchanged, so nothing shifts unless you were relying on the old behaviour. If your theme sets
--scalar-radiuson its own and expects the larger radii to stay put, set those tokens explicitly. Override--scalar-radiuson:root: a custom property substitutesvar()at the element where it is declared, so setting the base further down the tree moves it without moving anything derived from it.
-
- 1.62.715 Jul 2026
Nothing published for this version
- 1.62.615 Jul 2026
Release notes
Open source →Patch Changes
- #9618: Render document-wide authentication for AsyncAPI documents. The introduction now shows the same Authentication selector used for OpenAPI, populated from
components.securitySchemes, with requirements derived from the union of every server'ssecurity(AsyncAPI has no root-levelsecurity). When some servers require auth and others accept unauthenticated connections, a no-auth option is offered too. Schemes shared with OpenAPI (http,oauth2,openIdConnect,apiKey) get full input UI, and AsyncAPI OAuth2availableScopesare mapped onto OpenAPIscopesso the scope list renders. Broker-specific types still appear in the selector but have no dedicated input yet. The selector is now fully interactive for AsyncAPI (selecting schemes, entering credentials, editing scopes) because the auth mutators accept AsyncAPI documents. Operation/channel-level auth is intentionally left for a follow-up. - #9618: Name the actual document type in the "security scheme is missing a type" warning. When a scheme has no recognizable type, the auth selector previously always told users to check their "OpenAPI document", even for AsyncAPI documents. The warning now reflects the document it belongs to (e.g. "AsyncAPI") via a new optional
documentTypeprop on the auth selector block, defaulting toopenapi. Schemes that carry a valid but unsupported type (such as AsyncAPI broker types likeuserPasswordorscramSha256) now show a dedicated "not supported yet" message naming the type, instead of the misleading "missing a type" warning. - #9679: Fix the plugin
authaccessor reading from the wrong store. It now reads from the client store — the same store the reference-side Authentication panel writes credentials into — so plugins see the secrets and selected security schemes the user actually entered instead of an empty state.
- #9618: Render document-wide authentication for AsyncAPI documents. The introduction now shows the same Authentication selector used for OpenAPI, populated from
- 1.62.58 Jul 2026
Release notes
Open source →Patch Changes
-
#9671: Add a
canDeleteSchemesprop to the auth selector so the delete (trash) affordance can be hidden. It defaults totrue(unchanged for the API client, where schemes are editable) and the API reference now passesfalse, since its schemes come from the rendered document and cannot be removed there. -
#9646: Fix deep links to response properties. Response property anchors now carry a
responsesmarker so the target operation is found and scrolled to on a fresh load, and response properties are linkable even whenexpandAllResponsesis off (a deep link expands the collapsed response and scrolls the property into view). -
#9631: Hide the protocol and server filters in the classic layout for AsyncAPI documents
-
#9639: Add a read-only accessor for the global authentication state to the plugin API. Plugin lifecycle hooks (
onInit,onConfigChange) now receive anauthaccessor alongsideconfig, and the plugin manager exposesgetAuthState()for view components. Plugins can read stored secrets and the selected security schemes viaauth.export(),auth.getAuthSecrets(documentName, schemeName), andauth.getAuthSelectedSchemas(payload)without being able to mutate auth. -
#9664: fix: keep base allOf properties when merging oneOf/anyOf branches
When a schema used
allOfto factor out shared object properties next to aoneOf/anyOf, each branch's ownproperties/requiredoverwrote the shared base fields instead of being combined with them. The base fields now stay visible alongside each branch's own fields.
-
- 1.62.43 Jul 2026
Nothing published for this version
- 1.62.32 Jul 2026
Nothing published for this version
- 1.62.22 Jul 2026
Release notes
Open source →Patch Changes
- #9630: Render AsyncAPI tags without the extra horizontal indentation on nested channels, and replace the empty "Operations" card in an AsyncAPI tag header with a "Channels" card that lists the channels in the tag.
- #9541: Fix an SSR hydration mismatch on the root element: the obtrusive-scrollbar class is now resolved after mount so the first client render matches the server.
- 1.62.130 Jun 2026
Release notes
Open source →Patch Changes
- #9575: Render the discriminator variant dropdown for object schemas that only declare a
discriminator.mapping(no explicitoneOf/anyOf), which is the shape NSwag emits for polymorphic types - #9483: Render JSON Schema 2020-12
$dynamicRefin schemas, so generic patterns likePaginatedResponse<T>show their concrete bound item type (for exampleUser[]) instead of an empty shape. The reference threads the active dynamic scope through the schema tree and binds each$dynamicRefto the matching$dynamicAnchor. - #9587: Fix
Maximum call stack size exceededcrash when rendering a schema whose self-reference is reached through anallOfbranch
- #9575: Render the discriminator variant dropdown for object schemas that only declare a
- 1.62.026 Jun 2026
Release notes
Open source →Minor Changes
-
#9597: Add API Reference UI localization configuration with built-in English, Russian, Spanish, French, German, Simplified Chinese and Arabic translations, including automatic RTL direction for Arabic locales.
Update the shared theme reset so text inputs align to the logical start by default for RTL documents.
Add a
mergeObjectsdeep-merge helper to@scalar/helpers, used by the localization layer to merge translation overrides onto the built-in locale. -
#9568: Add AsyncAPI protocol and server pickers to the sidebar (like the multi-document picker) that filter the navigation down to the operations reachable over the selected protocol/server
-
#9543: Add the
x-scalar-linksOpenAPI extension to render extra named links (like a privacy policy or imprint) next to the contact, license and terms of service links in the introduction.
Patch Changes
-
#9545: Render the divider between the contact email and url links in the introduction, so they are separated like the other info links.
-
#8519: refactor: extract the code example block into
@scalar/blocks/code-example.api-client,api-client-react, andapi-referencenow importCodeExample,findClient,generateClientOptions, and the related helpers from the new package.workspace-storeexportsisParamDisabledwith an optionaldefaultDisabledargument.Breaking (
@scalar/api-client): the@scalar/api-client/blocks/operation-code-sampleand@scalar/api-client/v2/blocks/operation-code-sampleexport paths have been removed. Import from@scalar/blocks/code-exampleinstead, and use the renamedCodeExample/CodeExampleProps(previouslyOperationCodeSample/OperationCodeSampleProps). -
#9578: Show the
propertyNamestype and format (e.g.string · uuid) for a map of additional properties, so key constraints are no longer dropped from the rendered schema -
#9548: Keep request and response example pickers in sync across operations. Selecting an example (e.g. "Use case 1") now selects the example with the same key on every other operation that defines it, mirroring how the programming-language selection already syncs. Operations that do not have a matching example keep their current selection.
-
- 1.61.022 Jun 2026
Release notes
Open source →Minor Changes
-
#9520: Render AsyncAPI operations and their messages (with payload and header schemas) nested inside each channel, in both the modern and classic layouts
-
#9569: Show server and protocol labels when rendering AsyncAPI channels and messages: each channel header lists the servers it's available on and their protocols, and each message surfaces every protocol it's carried over (its channel's server protocols unioned with its own binding protocols)
-
#9515: feat: add
requestBuiltclient plugin hook andonRequestBuiltconfiguration callback that receive the exact fetchRequestthat is sent over the wireThe hook runs after the request has been built, right before it is sent. Header mutations apply to the outgoing request and the body bytes match what the server receives, which makes request signing possible: hashing the body of a rebuilt
multipart/form-datarequest would produce a different multipart boundary than the request that is actually sent.
Patch Changes
- #9559: Render an object's own properties when they are factored out alongside a composition keyword (
anyOf/oneOf/allOf/not) - #9542: Fix an SSR hydration mismatch in the injected
<style>tag: the CSS is now rendered verbatim instead of being HTML-escaped on the server ("became"), which broke font styles and caused a hydration mismatch. - #9546: fix: let a later
allOfmember override thedescriptionandtitleof an earlier one - #9557: Fix
oneOf/anyOfbeing dropped when nested inside anallOf. The composition is now preserved so its variants keep rendering alongside the merged base properties, instead of only the firstallOfmember showing up.
-
- 1.60.017 Jun 2026
Release notes
Open source →Minor Changes
- #9478: Add
content.startplugin view slot andsidebarvisibility option for plugin view components.content.start: A new view slot that renders custom plugin components before the Introduction/Info section (at the top of the content area).sidebaroption onViewComponent: Plugins can now opt-in to display a sidebar entry for their custom views by providingsidebar: { show: true, label: 'My Page' }. Omittingsidebaror settingshow: falsehides the entry from the sidebar. The entry hooks into the existing navigation, so clicking it scrolls to the plugin view and it highlights as it scrolls into view.
Patch Changes
- #9504: Fix extra nesting and duplicated description when array items are wrapped in a single-item composition (
allOf,oneOf, oranyOf) - #9526: Fix anchor links to schema properties that are hidden inside collapsed sections. Deep links now expand the disclosures on the path to the target property and scroll to it, so links work without enabling
expandAllSchemaProperties. - #9484: Fix the schema description being hidden for responses when
expandAllResponsesis enabled. A response's own description and its content schema's description are now both shown. - #9531: fix: the introduction loading skeleton now mirrors the actual layout (badges, title, links, description and selector cards) instead of generic stacked bars, so the page no longer jumps once the document loads
- #9524: Fix sidebar overlapping the content at exactly 1000px wide. The layout grid switched to the mobile (stacked) layout at
max-width: 1000pxwhile the sidebar visibility is driven by Tailwind'slg:variant (min-width: 1000px), so both fired at 1000px. The mobile breakpoint now useswidth < 1000px, the exact complement oflg:, so 1000px is treated as desktop.
- #9478: Add
- 1.59.311 Jun 2026
Release notes
Open source →Patch Changes
-
#9396: Refactor URL redirects into a routing-agnostic, list-driven engine. Redirects now operate on the bare navigation id, so each rule works across hash, hash-base-path, and path routing automatically. Also redirect old
models/<name>bookmarks to the configured models section slug when the section label is customized (e.g.schemas/). -
#9489: Do not render the info link list when no links are available.
-
#9342: fix: resolve operations when OpenAPI path items use
$refPath entries and webhooks can reference
components.pathItemsinstead of inlining operations. Navigation, mutators, search, and markdown export now resolve path-item references before reading HTTP methods and path-level parameters. -
#9498: Sync the SDK installation tabs with the operation code examples: picking a language under "Client Libraries" now switches every operation's code sample to that language's custom example
-
- 1.59.29 Jun 2026
Release notes
Open source →Patch Changes
- #9471: Restore support for the deprecated
sourceinstall command onx-scalar-sdk-installation. When set, it is appended todescriptionas a fenced code block (or used on its own when there is nodescription).descriptionremains the promoted field.
- #9471: Restore support for the deprecated
- 1.59.19 Jun 2026
Release notes
Open source →Patch Changes
- #9462: fix(api-reference): align examples panel and disable sticky when narrow
- 1.59.08 Jun 2026
Release notes
Open source →Minor Changes
-
#9435: feat(api-reference): render AsyncAPI channel parameters
Channel address parameters (the
{param}placeholders in a channel address) are now shown in the API reference, reusing the same parameter list component as OpenAPI operations. Theirenum,default, andexamplesare displayed on a string schema. -
#9438: feat(api-reference): add an AsyncAPI server selector
Adds a server selector for AsyncAPI documents in the API reference introduction. It mirrors the OpenAPI server selector but works with the AsyncAPI server shape (a named map of
host/protocol/pathname), labelling each server with its constructed connection URL.Server selection and variable changes are now persisted to the workspace store via new
asyncapi-server:update:selectedandasyncapi-server:update:variablesevents and their mutators, mirroring the OpenAPI wiring. -
#9422: Add a
nonceoption for Content Security Policy support.When you pass a
nonce, the rendered HTML stamps it onto the inline<script>and the CDN<script>tag (and Scalar's own<style>tags, plus a matching<meta property="csp-nonce">). This lets the API Reference run under a strictscript-srcwith nounsafe-inlineand nounsafe-eval.ApiReference({ url: '/openapi.json', // Match this value in your `script-src` CSP directive. nonce: 'r4nd0m', })Note:
style-srcstill needs'unsafe-inline'. The reference renders inlinestyle="…"attributes, which a CSP nonce can never authorize (nonces only apply to<script>,<style>and<link>elements), so a nonce-onlystyle-srcis not possible. The win is a fully strictscript-src. -
#9400: feat(api-reference): add
expandAllSchemaPropertiesconfig option.When enabled, nested schema properties are expanded by default while keeping the "Show/Hide Child Attributes" button available for manual collapsing. Expansion is cycle-safe: every finite branch is expanded fully, and self-referential ($ref or inline) schemas stop at the point they would otherwise recurse forever.
-
#9399: Show custom SDK installation instructions from
x-scalar-sdk-installationin the introduction card, falling back to the client selector when there are none. Each entry takes alangand a Markdowndescription, so a single tab can render rich instructions with syntax-highlighted code blocks (for example Maven and Gradle for Java)
Patch Changes
-
#9388: Add
ScalarVirtualCodeBlockcomponent with copy button support for virtualized code blocks -
#9436: Hide the client selector for AsyncAPI documents
-
#9398: feat: read code samples from x-readme, x-stainless and x-scalar extensions
In addition to
x-codeSamples, the code sample picker now reads custom samples fromx-scalar-examples,x-stainless-snippets,x-stainless-examples, andx-readme.code-samples. When more than one is present on an operation, the highest-priority source is used (x-scalar-examples > x-stainless-snippets > x-stainless-examples > x-readme > x-codeSamples). -
#9426: feat(api-reference): render the contact URL from
info.contact.url -
#8573: fix(api-reference): infer discriminator variants from mapping
-
#9131: fix(api-reference): preserve OAuth redirect URI when switching OpenAPI documents
When using multiple OpenAPI documents with OAuth configured via
oauth2RedirectUri, switching to another document no longer clears the Redirect URL in the Authentication section.The fix threads
oauth2RedirectUrifrom the top-level configuration into the security scheme merge chain so that each newly loaded document's OAuth flows are pre-populated with the configured redirect URI, rather than relying solely on a component-level watcher that would skip re-population when the same OAuth flow identity was detected across documents. -
#9391: fix: stabilize the tab title at the top of the document
The document-start sentinel and the Introduction section both fire an intersection event at scroll-top. They resolved to different entries, so the tab title raced between the section title and the document title. The sentinel now emits the Introduction entry, so both agree.
-
#9370: fix(api-reference): rework the modern operation layout with CSS grid so the request example sits directly under the description on narrow screens, and move the operation title and auth badge into the same grid
-
#9421: fix(api-reference): avoid SSR hydration mismatch from the search shortcut and teleport ids
The macOS search shortcut symbol was derived from
navigatorduring render, so a Mac client hydrated⌘where the server sent⌃. The platform is now resolved after mount. Teleport target ids and the search modal ids also switched fromnanoid()to Vue's SSR-stableuseId(). -
#9392: Clean up the standalone build's injected
<head>styles ondestroy()so they no longer linger after SPA-style navigation (Turbo Drive, htmx). The styles are re-attached when a new instance mounts. -
#9420: fix(api-reference): make x-tagGroups titles navigable from search
Tag group titles appeared as search results but clicking them did nothing, because the flattened modern layout rendered no element carrying the tag group id to scroll to. The group now exposes its id as a scroll anchor.
-
- 1.58.02 Jun 2026
Release notes
Open source →Minor Changes
-
#9372: Render AsyncAPI
components.schemasas Models, listed in the sidebar and content just like OpenAPI schemas -
#7618: feat(api-reference): add
setPageTitleto customize the browser tab titlePass a
setPageTitlefunction to control the browser tab title. It is called whenever the section in view changes — on sidebar clicks, on scroll, and when switching documents — and receives the section title and the active OpenAPI document:setPageTitle: ({ title, document }) => `${document.title} – ${title}`
Patch Changes
-
#9348: Render AsyncAPI channels as sections in the content area, with the channel address as the heading and the channel description below. Channels are grouped under tags when the navigation tree groups them. Operations and messages are not rendered yet.
-
#9255: Surface the Introduction entry and any headings extracted from
info.descriptionof AsyncAPI documents in the sidebar, mirroring how OpenAPI documents are handled. -
#9347: Surface AsyncAPI
info.descriptionheadings in the search modal, mirroring the sidebar behaviour. AsyncAPI channels, operations, and messages are not indexed yet. -
#9350: feat(api-reference): list Ask AI and MCP Servers as Scalar Docs features in the Deploy popover
-
#9310: Add an ESM standalone build (
dist/browser/standalone.esm.js) alongside the existing UMD bundle. The new bundle works as a side-effect script (registerswindow.Scalar.createApiReferenceand readsdata-*configuration) and exportscreateApiReferencefor direct ESM consumers. It is fully minified through Rolldown's native minifier and uses code splitting so heavy features load asynchronously after first paint:- The API client modal (request editor, response viewer, CodeMirror) is now
await import'd insideonMountedinstead of statically imported, moving ~265 KB into achunks/modal-*.jschunk that loads in the background. - The Agent Scalar chat interface (already wrapped in
defineAsyncComponent) becomes a realchunks/AgentScalarChatInterface-*.jschunk (~200 KB), loaded only when the agent is enabled. - The 84 per-icon dynamic imports from
@scalar/icons/libraryare coalesced into a singlechunks/icons-*.js.
Net effect: initial sync load drops from ~3.32 MB (UMD) to ~2.73 MB (ESM) — a ~570 KB improvement — while total bundle size shrinks by ~140 KB.
Also adds an
@scalar/api-client/modal/map-hidden-clients-configdeep export so consumers that only need the lightweight client-list helper don't pull the full modal barrel into their static graph. - The API client modal (request editor, response viewer, CodeMirror) is now
-
#9139: fix(api-reference): preserve OAuth redirect URL when switching between OpenAPI documents
Auth changes were being persisted under the wrong document slug and shared a single debounce queue across all documents. When switching documents quickly, the pending save for the first document could be overwritten or dropped by a save for the second document, causing the redirect URL (and other auth secrets) to appear cleared after switching back.
The fix uses
event.documentNameas both the debounce key and the storage key, giving each document its own independent debounce queue. -
#9194: fix(api-reference): break cycles in
mergeAllOfSchemasfor self-referencing schemas (whether they$refback to themselves through array items or through a plain object property), which previously crashed the docs preview with "too much recursion" -
#9309: feat: add
modelsSectionLabelconfiguration ('Models' | 'Schemas' | string) to use OpenAPI-style Schemas terminology in the sidebar, content, and search.
-
- 1.57.522 May 2026
Release notes
Open source →Patch Changes
-
#9318: fix: restore response content type selector when expandAllResponses is enabled
Move the content type picker after the disclosure panel so it stacks above expanded response content and remains clickable when
expandAllResponsesis true.
-
- 1.57.422 May 2026
Nothing published for this version
- 1.57.321 May 2026
Release notes
Open source →Patch Changes
- #9169: feat: add
customFetchto the api-reference configuration and forward it to the API client so requests (including "Test Request" calls) use the custom fetch — enabling things likecredentials: 'include'. The previousfetchoption is deprecated and migrated automatically with a console warning. - #9273: fix: render
null, whitespace-only, andvalue/externalValue-shaped schema examples correctly
- #9169: feat: add
- 1.57.216 May 2026
Release notes
Open source →Patch Changes
- #9234: fix(api-reference): prevent security badge from shrinking
- 1.57.114 May 2026
Nothing published for this version
- 1.57.014 May 2026
Release notes
Open source →Minor Changes
- #9211: feat: make
WorkspaceDocumentan union of OpenApiDocument and AsyncApiDocument
Patch Changes
-
#9211: fix(api-reference): clean up deprecated document listeners on destroy
createApiReference()registered three document-level listeners (scalar:reload-references,scalar:destroy-references,scalar:update-references-config) butdestroy()only unmounted the Vue app — the listeners stayed attached forever. In environments that mount and destroy instances repeatedly (notably the Astro integration'srenderMode="client"with view transitions), each navigation leaked three permanent listeners ondocument.Tie the listeners to an
AbortControllerand abort it fromdestroy()so they all come off in one shot. -
#9211: fix: show "Download AsyncAPI Document" label for AsyncAPI documents
-
#9211: fix: rename the "OAS" version badge to "OpenAPI" and show an "AsyncAPI" badge for AsyncAPI documents
-
#9211: fix(api-client): block invalid request URLs before send and surface
buildRequestfailures as resultsRequest construction now treats a bad merged URL as a first-class failure instead of throwing deep inside helpers. After
mergeUrls,resolveRequestFactoryUrlrejects incomplete targets when strict mode applies: relative URLs, an empty server base, or path strings that still contain unresolved{{variable}}placeholders. Callers may setallowMissingRequestServerBasewhere a full absolute URL is intentionally optional (for example the embedded modal layout inOperationBlock, or API ReferenceonBeforeRequesthooks that build against the document origin).buildRequestreturns aResult(ok/err) with stable error codes such asMISSING_REQUEST_SERVER_BASE,INVALID_REQUEST_FACTORY_URL, andBUILD_REQUEST_FAILEDfor unexpected synchronous failures. Those failures are wrapped withsafeRunfrom@scalar/helpers, which logs toconsole.errorand maps throws to a string message on the result. The API Reference plugin path logs and skipsonBeforeRequestwhen a preview request cannot be built, so user hooks never run against a half-built fetch payload.Downstream packages (
api-client,api-reference,scalar-appwhere applicable) unwrap the result, show toasts or logs, and avoid callingsendRequestuntil the URL is valid. -
#9211: fix(api-reference): improve search ranking for parameter, request-body, and model field names, including polymorphic (oneOf/anyOf/allOf) schemas
-
#9211: fix: resolve $ref in additionalProperties before rendering schema
-
#9211: chore: use the new schemas
-
#9211: Fix mobile sidebar z-index to ensure it appears above all content when open
-
#9211: Avoid repeating request body schema descriptions above collapsed overflow properties.
-
#9211: feat: add more analytics events
-
#9211: fix: agent scalar warnings
-
#9211: fix(api-reference): lower badge style specificity
-
#9211: fix: posthog stream warning
- #9211: feat: make
- 1.55.35 May 2026
Release notes
Open source →Patch Changes
- #9095: fix(api-reference): use overflow-wrap break-word for tag labels
- 1.55.25 May 2026
- 1.55.130 Apr 2026
- 1.55.029 Apr 2026
Release notes
Open source →Minor Changes
- #9045: feat(api-reference): show an "auth required" / "auth optional" badge next to each operation's path. Requirements are resolved via
operation.security ?? document.security; hover reveals the scheme names, types, and any required scopes.
Patch Changes
- #9045: fix(api-reference): flatten deepObject query parameter display in parameter rendering
- #9045: fix inline composed schema descriptions in api-reference
- #9045: fix(api-reference): ignore undefined examples on flattened deepObject parameters
- #9045: fix: remove extraneous eventBus prop from AgentScalarDrawer to eliminate Vue warning
- #9043: chore: move test documents to cdn
- #9045: chore: move scalar version logs
- #9045: feat(api-reference): show an "auth required" / "auth optional" badge next to each operation's path. Requirements are resolved via
- 1.54.029 Apr 2026
Release notes
Open source →Minor Changes
- #8970: feat(api-reference): show an "auth required" / "auth optional" badge next to each operation's path. Requirements are resolved via
operation.security ?? document.security; hover reveals the scheme names, types, and any required scopes.
Patch Changes
- #8963: fix(api-reference): flatten deepObject query parameter display in parameter rendering
- #8906: fix inline composed schema descriptions in api-reference
- #8963: fix(api-reference): ignore undefined examples on flattened deepObject parameters
- #9003: fix: remove extraneous eventBus prop from AgentScalarDrawer to eliminate Vue warning
- #8987: chore: move scalar version logs
- #8970: feat(api-reference): show an "auth required" / "auth optional" badge next to each operation's path. Requirements are resolved via
- 1.53.128 Apr 2026
Nothing published for this version
- 1.53.027 Apr 2026
- 1.52.623 Apr 2026
Nothing published for this version
- 1.52.522 Apr 2026
Nothing published for this version
- 1.52.421 Apr 2026
Release notes
Open source →Patch Changes
- #8884: fix: restore
position: fixedon.section-flareso the decorative hero flare stops reserving 100vh of empty space at the top of the documentation (affects thekepler,bluePlanet, andmarsthemes, which declareheight: 100vhon the flare but rely on the framework to position it) - #8907: Fix code sample missing body content type update
- #8925: chore: source vite-plugin-css-injected-by-js from the shared pnpm catalog
- #8944: feat(api-reference): add anchors and copy link buttons to allOf body parameters
- #8884: fix: restore
- 1.52.318 Apr 2026
- 1.52.216 Apr 2026
Release notes
Open source →Patch Changes
- #8827: chore: removed old client v1 code
- #8791: fix test requests so exploded array query parameters keep all values instead of collapsing to the last one
- #8863: chore: updated imports to new api client version
- #8780: fix: run intersect for the top of the document
- #8825: chore: moving files around in preparation for the big deletion of client v1
- #8831: refactor(api-reference): remove search index ts-expect-error by using typed collection access
- #8784: fix: correctly display schema names
- 1.52.111 Apr 2026
Release notes
Open source →Patch Changes
- #8769: feat(themes): add Tailwind v3 transform reset
- #8767: feat(api-reference): collapse truncated descriptions
- #8776: fix: hide content type switch when there is no content
- #8777: fix(api-reference): set example z-index to context layer
- #8770: fix: generate the response examples by removing the priority order
- 1.52.09 Apr 2026
- 1.51.04 Apr 2026
Release notes
Open source →Minor Changes
- #8712: feat: use separate stores for client and shared state on the reference
Patch Changes
- #8728: fix: correctly merge security schemes with the config security
- 1.50.03 Apr 2026
Release notes
Open source →Minor Changes
- #8524: feat: move request logic on the store and generate a request builder
- #8609: feat: display tag groups for classic layout
Patch Changes
- #8657: test(api-reference): add regression coverage for hiddenClients source switching
- #8642: refactor(api-reference): remove openapi-types dependency and align with workspace-store types
- #8659: fix search indexing to include path-level parameters and response examples for operations
- #8650: fix: ensure we have a introduction entry on the sidear by default
- 1.49.831 Mar 2026
- 1.49.729 Mar 2026
Release notes
Open source →Patch Changes
- #8612: fix: intersection observer for scroll-spy and tall sections
- 1.49.628 Mar 2026
- 1.49.525 Mar 2026
- 1.49.424 Mar 2026
- 1.49.320 Mar 2026
- 1.49.220 Mar 2026
- 1.49.118 Mar 2026
- 1.49.017 Mar 2026
Release notes
Open source →Minor Changes
- #8409: feat: lazy rendering
Patch Changes
- #8443: fix hash-prefixed basePath routing
- #8467: feat(api-reference): improve Ask AI button consistency and a11y
- #8442: fix object schema descriptions in parameter rendering
Updated Dependencies
-
@scalar/[email protected]
- #8468: fix: ignore response examples when generating navigation
-
@scalar/[email protected]
-
@scalar/[email protected]
- #8448: fix parser validation for unused path parameters
-
@scalar/[email protected]
- #8453: refactor: remove @ts-expect-error from ScalarTextArea
-
@scalar/[email protected]
-
@scalar/[email protected]
-
@scalar/[email protected]
- 1.48.815 Mar 2026
Release notes
Open source →Patch Changes
- #8425: fix auth default OAuth scope fallback
- #8416: fix: direct css import breaks build in react, vitepress and others
- #8417: fix: document not defined in SSR environments
Updated Dependencies
-
@scalar/[email protected]
-
@scalar/[email protected]
- #8416: fix: direct css import breaks build in react, vitepress and others
-
@scalar/[email protected]
-
@scalar/[email protected]
-
@scalar/[email protected]
-
@scalar/[email protected]
- 1.48.713 Mar 2026
Release notes
Open source →Patch Changes
Updated Dependencies
-
@scalar/[email protected]
- #8426: feat: interact with the original and intermediate documents
-
@scalar/[email protected]
- #8426: feat: sync with source flow with conflict resolution
-
@scalar/[email protected]
-
@scalar/[email protected]
-
@scalar/[email protected]
-
@scalar/[email protected]
-
- 1.48.612 Mar 2026
Release notes
Open source →Patch Changes
- #8414: fix(api-reference): limit height of example response descriptions
Updated Dependencies
-
@scalar/[email protected]
- #8414: fix(api-client): pass example picker attributes to button component
-
@scalar/[email protected]
- #8327: fix: markdown tables with specified width attributes in td/th break the layout
-
@scalar/[email protected]
- #8420: fix TypeScript access to navigator.userAgentData in isMacOS without ts-expect-error
-
@scalar/[email protected]
-
@scalar/[email protected]
-
@scalar/[email protected]
-
@scalar/[email protected]
-
@scalar/[email protected]
-
@scalar/[email protected]
-
@scalar/[email protected]
- 1.48.511 Mar 2026
Release notes
Open source →Patch Changes
- #8406: feat: x-order
- #8097: fix: lazy load compositions
- #8380: feat(api-reference): render
<a>HTML tag fordocumentDownloadType: direct
Updated Dependencies
-
@scalar/[email protected]
-
@scalar/[email protected]
- #8403: Persist auth url and token url in local storage
- #8402: Fix raw binary request bodies so uploaded files are sent correctly and code samples show file references.
- #8398: fix code snippet HAR request URL generation to URL-encode substituted path parameter values, matching request sending behavior.
- #8386: feat: app drag region for macos
- #8408: Use the secret oauth urls before the default flow urls
- #8407: Fix conditional rendering for token URL
-
@scalar/[email protected]
- #8404: Preserve duplicate query parameters in generated code snippets. php/guzzle: preserve duplicate query parameters as arrays.
-
@scalar/[email protected]
- #8386: feat: add spacer slot to sidebar
-
@scalar/[email protected]
-
@scalar/[email protected]
-
@scalar/[email protected]
- 1.48.410 Mar 2026
Release notes
Open source →