Katana API

REST/JSON API (v1) for Katana cloud manufacturing ERP — sales orders, purchase orders, manufacturing orders, products, variants, materials, inventory, customers, suppliers, batches, serial numbers, bin locations and webhooks. Bearer API-key auth; documented with a full OpenAPI 3.0 spec.

OpenAPI Specification

katana-openapi-original.json Raw ↑
{
  "openapi": "3.0.0",
  "info": {
    "title": "katana-api-gateway",
    "version": "0.0.1",
    "description": "public api",
    "contact": {}
  },
  "paths": {
    "/additional_costs": {
      "get": {
        "x-controller-name": "AdditionalCostController",
        "x-operation-name": "getAdditionalCosts",
        "tags": [
          "AdditionalCostController"
        ],
        "responses": {
          "200": {
            "description": "Return value of AdditionalCostController.getAdditionalCosts"
          }
        },
        "operationId": "AdditionalCostController.getAdditionalCosts",
        "parameters": [
          {
            "name": "pagination",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          {
            "name": "dateFilter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "maximum": 2147483647
              }
            }
          },
          {
            "name": "name",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_deleted",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ]
      }
    },
    "/batch_stocks/{id}": {
      "patch": {
        "x-controller-name": "BatchStockController",
        "x-operation-name": "updateBatchStock",
        "tags": [
          "BatchStockController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BatchStockController.updateBatchStock"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateBatchDto"
              }
            }
          },
          "required": true
        },
        "operationId": "BatchStockController.updateBatchStock",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": true
          }
        ]
      }
    },
    "/batch_stocks": {
      "get": {
        "x-controller-name": "BatchStockController",
        "x-operation-name": "getBatchStock",
        "tags": [
          "BatchStockController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BatchStockController.getBatchStock"
          }
        },
        "operationId": "BatchStockController.getBatchStock",
        "parameters": [
          {
            "name": "pagination",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          {
            "name": "batch_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "batch_number",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "location_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "variant_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "batch_barcode",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_empty",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "batch_created_at_max",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "batch_created_at_min",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/batches": {
      "post": {
        "x-controller-name": "BatchController",
        "x-operation-name": "createBatch",
        "tags": [
          "BatchController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BatchController.createBatch"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateBatchDto"
              }
            }
          },
          "required": true
        },
        "operationId": "BatchController.createBatch"
      }
    },
    "/bin_inventory": {
      "get": {
        "x-controller-name": "BinInventoryController",
        "x-operation-name": "findAndPaginate",
        "tags": [
          "BinInventoryController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinInventoryController.findAndPaginate"
          }
        },
        "operationId": "BinInventoryController.findAndPaginate",
        "parameters": [
          {
            "name": "pagination",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          {
            "name": "granularity",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "VARIANT",
                "BATCH",
                "SERIAL_NUMBER"
              ]
            }
          },
          {
            "name": "location_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "variant_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "bin_location_id",
            "in": "query",
            "schema": {
              "type": "string",
              "pattern": "^(\\d+|null)$"
            }
          },
          {
            "name": "batch_id",
            "in": "query",
            "schema": {
              "type": "string",
              "pattern": "^(\\d+|null)$"
            }
          },
          {
            "name": "serial_number_id",
            "in": "query",
            "schema": {
              "type": "string",
              "pattern": "^(\\d+|null)$"
            }
          }
        ]
      }
    },
    "/bin_locations/{id}": {
      "patch": {
        "x-controller-name": "BinLocationController",
        "x-operation-name": "updateBinLocation",
        "tags": [
          "BinLocationController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinLocationController.updateBinLocation"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BinLocationUpdateDto"
              }
            }
          },
          "required": true,
          "x-parameter-index": 1
        },
        "operationId": "BinLocationController.updateBinLocation",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": true
          }
        ]
      },
      "delete": {
        "x-controller-name": "BinLocationController",
        "x-operation-name": "deleteBinLocation",
        "tags": [
          "BinLocationController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinLocationController.deleteBinLocation"
          }
        },
        "operationId": "BinLocationController.deleteBinLocation",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": true
          }
        ]
      }
    },
    "/bin_locations": {
      "post": {
        "x-controller-name": "BinLocationController",
        "x-operation-name": "createBinLocation",
        "tags": [
          "BinLocationController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinLocationController.createBinLocation"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BinLocationCreateDto"
              }
            }
          },
          "required": true
        },
        "operationId": "BinLocationController.createBinLocation"
      },
      "get": {
        "x-controller-name": "BinLocationController",
        "x-operation-name": "findBinLocations",
        "tags": [
          "BinLocationController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinLocationController.findBinLocations"
          }
        },
        "operationId": "BinLocationController.findBinLocations",
        "parameters": [
          {
            "name": "location_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "bin_name",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "pagination",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          {
            "name": "include_deleted",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ]
      }
    },
    "/bin_transfer_rows/{id}": {
      "patch": {
        "x-controller-name": "BinTransferRowController",
        "x-operation-name": "updateById",
        "tags": [
          "BinTransferRowController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinTransferRowController.updateById"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateBinTransferRowDto"
              }
            }
          },
          "required": true,
          "x-parameter-index": 1
        },
        "operationId": "BinTransferRowController.updateById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": true
          }
        ]
      },
      "get": {
        "x-controller-name": "BinTransferRowController",
        "x-operation-name": "findById",
        "tags": [
          "BinTransferRowController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinTransferRowController.findById"
          }
        },
        "operationId": "BinTransferRowController.findById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": true
          }
        ]
      },
      "delete": {
        "x-controller-name": "BinTransferRowController",
        "x-operation-name": "deleteById",
        "tags": [
          "BinTransferRowController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinTransferRowController.deleteById"
          }
        },
        "operationId": "BinTransferRowController.deleteById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": true
          }
        ]
      }
    },
    "/bin_transfer_rows": {
      "post": {
        "x-controller-name": "BinTransferRowController",
        "x-operation-name": "create",
        "tags": [
          "BinTransferRowController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinTransferRowController.create"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateBinTransferRowDto"
              }
            }
          },
          "required": true
        },
        "operationId": "BinTransferRowController.create"
      },
      "get": {
        "x-controller-name": "BinTransferRowController",
        "x-operation-name": "findAndPaginate",
        "tags": [
          "BinTransferRowController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinTransferRowController.findAndPaginate"
          }
        },
        "operationId": "BinTransferRowController.findAndPaginate",
        "parameters": [
          {
            "name": "pagination",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          {
            "name": "dateFilter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "maximum": 2147483647
              }
            }
          },
          {
            "name": "bin_transfer_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "variant_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "source_bin_location_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "target_bin_location_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "include_deleted",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ]
      }
    },
    "/bin_transfers/{id}/status": {
      "patch": {
        "x-controller-name": "BinTransferController",
        "x-operation-name": "updateStatus",
        "tags": [
          "BinTransferController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinTransferController.updateStatus"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateBinTransferStatusDto"
              }
            }
          },
          "required": true,
          "x-parameter-index": 1
        },
        "operationId": "BinTransferController.updateStatus",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": true
          }
        ]
      }
    },
    "/bin_transfers/{id}": {
      "patch": {
        "x-controller-name": "BinTransferController",
        "x-operation-name": "updateById",
        "tags": [
          "BinTransferController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinTransferController.updateById"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateBinTransferDto"
              }
            }
          },
          "required": true,
          "x-parameter-index": 1
        },
        "operationId": "BinTransferController.updateById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": true
          }
        ]
      },
      "get": {
        "x-controller-name": "BinTransferController",
        "x-operation-name": "findById",
        "tags": [
          "BinTransferController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinTransferController.findById"
          }
        },
        "operationId": "BinTransferController.findById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": true
          }
        ]
      },
      "delete": {
        "x-controller-name": "BinTransferController",
        "x-operation-name": "deleteById",
        "tags": [
          "BinTransferController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinTransferController.deleteById"
          }
        },
        "operationId": "BinTransferController.deleteById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "integer",
              "format": "int32"
            },
            "required": true
          }
        ]
      }
    },
    "/bin_transfers": {
      "post": {
        "x-controller-name": "BinTransferController",
        "x-operation-name": "create",
        "tags": [
          "BinTransferController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinTransferController.create"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateBinTransferDto"
              }
            }
          },
          "required": true
        },
        "operationId": "BinTransferController.create"
      },
      "get": {
        "x-controller-name": "BinTransferController",
        "x-operation-name": "findAndPaginate",
        "tags": [
          "BinTransferController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BinTransferController.findAndPaginate"
          }
        },
        "operationId": "BinTransferController.findAndPaginate",
        "parameters": [
          {
            "name": "pagination",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          {
            "name": "dateFilter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          {
            "name": "ids",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "maximum": 2147483647
              }
            }
          },
          {
            "name": "bin_transfer_number",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "location_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "enum": [
                "CREATED",
                "IN_TRANSIT",
                "DONE"
              ],
              "type": "string"
            }
          },
          {
            "name": "include_deleted",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ]
      }
    },
    "/bom_rows/batch/create": {
      "post": {
        "x-controller-name": "BomRowController",
        "x-operation-name": "createBomRowsBatch",
        "tags": [
          "BomRowController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BomRowController.createBomRowsBatch"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateBomRowsBatchDto"
              }
            }
          },
          "required": true
        },
        "operationId": "BomRowController.createBomRowsBatch"
      }
    },
    "/bom_rows/{id}": {
      "patch": {
        "x-controller-name": "BomRowController",
        "x-operation-name": "updateBomRow",
        "tags": [
          "BomRowController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BomRowController.updateBomRow"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BomRowUpdateDto"
              }
            }
          },
          "required": true,
          "x-parameter-index": 1
        },
        "operationId": "BomRowController.updateBomRow",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ]
      },
      "delete": {
        "x-controller-name": "BomRowController",
        "x-operation-name": "deleteBomRow",
        "tags": [
          "BomRowController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BomRowController.deleteBomRow"
          }
        },
        "operationId": "BomRowController.deleteBomRow",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ]
      }
    },
    "/bom_rows": {
      "post": {
        "x-controller-name": "BomRowController",
        "x-operation-name": "createBomRow",
        "tags": [
          "BomRowController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BomRowController.createBomRow"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BomRowCreateDto"
              }
            }
          },
          "required": true
        },
        "operationId": "BomRowController.createBomRow"
      },
      "get": {
        "x-controller-name": "BomRowController",
        "x-operation-name": "getBomRows",
        "tags": [
          "BomRowController"
        ],
        "responses": {
          "200": {
            "description": "Return value of BomRowController.getBomRows"
          }
        },
        "operationId": "BomRowController.getBomRows",
        "parameters": [
          {
            "name": "pagination",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          {
            "name": "dateFilter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          {
            "name": "id",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "product_variant_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "product_item_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "ingredient_variant_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ]
      }
    },
    "/custom_field_definitions/{id}": {
      "patch": {
        "x-controller-name": "CustomFieldDefinitionController",
        "x-operation-name": "update",
        "tags": [
          "CustomFieldDefinitionController"
        ],
        "responses": {
          "200": {
            "description": "Return value of CustomFieldDefinitionController.update"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateCustomFieldDefinitionDto"
              }
            }
          },
          "required": true,
          "x-parameter-index": 1
        },
        "operationId": "CustomFieldDefinitionController.update",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ]
      },
      "get": {
        "x-controller-name": "CustomFieldDefinitionController",
        "x-operation-name": "getById",
        "tags": [
          "CustomFieldDefinitionController"
        ],
        "responses": {
          "200": {
            "description": "Return value of CustomFieldDefinitionController.getById"
          }
        },
        "operationId": "CustomFieldDefinitionController.getById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ]
      },
      "delete": {
        "x-controller-name": "CustomFieldDefinitionController",
        "x-operation-name": "deleteById",
        "tags": [
          "CustomFieldDefinitionController"
        ],
        "responses": {
          "200": {
            "description": "Return value of CustomFieldDefinitionController.deleteById"
          }
        },
        "operationId": "CustomFieldDefinitionController.deleteById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ]
      }
    },
    "/custom_field_definitions": {
      "post": {
        "x-controller-name": "CustomFieldDefinitionController",
        "x-operation-name": "create",
        "tags": [
          "CustomFieldDefinitionController"
        ],
        "responses": {
          "200": {
            "description": "Return value of CustomFieldDefinitionController.create"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCustomFieldDefinitionDto"
              }
            }
          },
          "required": true
        },
        "operationId": "CustomFieldDefinitionController.create"
      },
      "get": {
        "x-controller-name": "CustomFieldDefinitionController",
        "x-operation-name": "getAll",
        "tags": [
          "CustomFieldDefinitionController"
        ],
        "responses": {
          "200": {
            "description": "Return value of CustomFieldDefinitionController.getAll"
          }
        },
        "operationId": "CustomFieldDefinitionController.getAll",
        "parameters": [
          {
            "name": "pagination",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          {
            "name": "dateFilter",
            "in": "query",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          {
            "name": "label",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "field_type",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "entity_type",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/custom_fields_collections": {
      "get": {
        "x-controller-name": "ItemsCustomFieldsCollectionController",
        "x-operation-name": "getAllCollections",
        "tags": [
          "ItemsCustomFieldsCollectionController"
        ],
        "responses": {
          "200": {
            "description": "Return value of ItemsCustomFieldsCollectionController.getAllCollections"
          }
        },
        "operationId": "ItemsCustomFieldsCollectionController.getAllCollections"
      }
    },
    "/customer_addresses/{id}": {
      "patch": {
        "x-controller-name": "CustomerAddressController",
        "x-operation-name": "updateCustomerAddress",
        "tags": [
          "CustomerAddressController"
        ],
        "responses": {
          "200": {
            "description": "Return value of CustomerAddressController.updateCustomerAddress"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerAddressUpdateDto"
              }
            }
          },
          "required": true,
          "x-parameter-index": 1
        },
        "operationId": "CustomerAddressController.u

# --- truncated at 32 KB (609 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/katana/refs/heads/main/openapi/katana-openapi-original.json