Swagger's converter, minus its bugs

Lift your API spec to OpenAPI 3

Drop in a Swagger 2.0 spec as JSON or YAML and get the OpenAPI 3 output Swagger's official converter produces, with its bugs fixed. Every step runs in your browser. Nothing leaves this browser.

  • 100% client-side
  • JSON & YAML
  • No sign-up, no tracking
Samples
Nothing leaves this browser
Swagger 2.0

swagger.json

OpenAPI 3.0 · bugs fixed

openapi.json

{
  "openapi": "3.0.1",
  "info": {
    "title": "Orders API",
    "description": "Create and track customer orders.",
    "version": "1.4.0"
  },
  "servers": [
    {
      "url": "https://api.example.com/v1"
    }
  ],
  "paths": {
    "/orders": {
      "get": {
        "summary": "List orders",
        "operationId": "listOrders",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A list of orders",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Order"
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Create an order",
        "operationId": "createOrder",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewOrder"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Order created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Order"
                }
              }
            }
          }
        },
        "x-codegen-request-body-name": "order"
      }
    }
  },
  "components": {
    "schemas": {
      "NewOrder": {
        "required": [
          "productId",
          "quantity"
        ],
        "type": "object",
        "properties": {
          "productId": {
            "type": "string"
          },
          "quantity": {
            "minimum": 1,
            "type": "integer"
          }
        }
      },
      "Order": {
        "allOf": [
          {
            "$ref": "#/components/schemas/NewOrder"
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "enum": [
                  "pending",
                  "shipped"
                ]
              }
            }
          }
        ]
      }
    }
  },
  "x-original-swagger-version": "2.0"
}
Sample converted. Paste your own Swagger 2.0 spec to begin.

Every Swagger 2.0 concept, remapped.

SpecLift follows the same rules as Swagger's converter, so tooling that expects its output keeps working.

  • host + basePath + schemesservers[].url
  • definitionscomponents.schemas
  • in: bodyrequestBody.content
  • in: formDatarequestBody (form / multipart)
  • consumes / producescontent media types
  • type: filetype: string, format: binary
  • collectionFormatstyle + explode
  • securityDefinitionscomponents.securitySchemes
  • type: basictype: http, scheme: basic
  • flow: accessCodeflows.authorizationCode
  • parameters / responsescomponents.*
  • #/definitions/…#/components/schemas/…

Same rules. Fewer surprises.

In a few places Swagger's converter writes invalid OpenAPI or quietly drops data. SpecLift fixes these by default. Turn off “Fix Swagger bugs” for byte-for-byte Swagger output.

  • Swaggertype: file inside schemas stays fileSpecLifttype: string, format: binary
  • Swaggerdate defaults become "…T00:00:00.000+00:00"SpecLiftdates stay "2021-01-01"
  • Swaggerarray defaults become text "[\"a\"]"SpecLiftreal arrays ["a"]
  • Swaggernumeric form enums become ["1", "5"]SpecLiftnumbers stay numbers
  • Swaggerobject examples become Java text "{a=1}"SpecLiftexamples stay JSON
  • Swaggershared params lose example / nullable after first useSpecLiftevery use keeps them
  • Swaggerdefaults, enums, readOnly, discriminators silently droppedSpecLiftkept in the output
  • Swaggeroperation schemes and x- extensions droppedSpecLiftoperation servers and extensions kept

Your API never leaves the tab.

Internal specs often describe systems nobody outside your team should see. SpecLift has no backend to send them to.

Runs in your browser

Files are read with the FileReader API, converted in memory and downloaded from a local Blob.

No tracking, no storage

No accounts, analytics, telemetry or third-party fonts. Close the tab and nothing remains.

Swagger-exact on demand

With bug fixes off, output is identical to converter.swagger.io, key order included. That is tested on 99 real-world APIs and 54 edge-case fixtures.