Runs in your browser
Files are read with the FileReader API, converted in memory and downloaded from a local Blob.
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.
{
"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"
}SpecLift follows the same rules as Swagger's converter, so tooling that expects its output keeps working.
host + basePath + schemesservers[].urldefinitionscomponents.schemasin: bodyrequestBody.contentin: formDatarequestBody (form / multipart)consumes / producescontent media typestype: filetype: string, format: binarycollectionFormatstyle + explodesecurityDefinitionscomponents.securitySchemestype: basictype: http, scheme: basicflow: accessCodeflows.authorizationCodeparameters / responsescomponents.*#/definitions/…#/components/schemas/…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.
type: file inside schemas stays fileSpecLifttype: string, format: binarydate defaults become "…T00:00:00.000+00:00"SpecLiftdates stay "2021-01-01"array defaults become text "[\"a\"]"SpecLiftreal arrays ["a"]numeric form enums become ["1", "5"]SpecLiftnumbers stay numbersobject examples become Java text "{a=1}"SpecLiftexamples stay JSONshared params lose example / nullable after first useSpecLiftevery use keeps themdefaults, enums, readOnly, discriminators silently droppedSpecLiftkept in the outputoperation schemes and x- extensions droppedSpecLiftoperation servers and extensions keptInternal specs often describe systems nobody outside your team should see. SpecLift has no backend to send them to.
Files are read with the FileReader API, converted in memory and downloaded from a local Blob.
No accounts, analytics, telemetry or third-party fonts. Close the tab and nothing remains.
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.
If SpecLift saves you an afternoon of hand-migrating specs, sponsoring keeps it maintained and bug-for-bug current with Swagger.