{
  "openapi": "3.1.0",
  "info": {
    "title": "BTX External Trading API",
    "version": "0.4.0",
    "description": "BTX external REST API: https://api.btxpro.co.kr. Public and authenticated WebSocket API: wss://api-ws.btxpro.co.kr. The authenticated user WebSocket provides both user events and order commands on the same connection. The current API does not expose client order ids, client cancel ids, per-wallet API key scopes, or request-tracking endpoints.",
    "contact": {
      "name": "BTX API Support"
    },
    "license": {
      "name": "Proprietary"
    }
  },
  "servers": [
    {
      "url": "https://api.btxpro.co.kr",
      "description": "Production external trading REST"
    },
    {
      "url": "http://localhost:10005",
      "description": "Local maingateway externalrest"
    },
    {
      "url": "https://api-staging.dovewallet.kr",
      "description": "Staging external trading REST"
    }
  ],
  "tags": [
    {
      "name": "system",
      "description": "Health and server time"
    },
    {
      "name": "public",
      "description": "Public market data"
    },
    {
      "name": "feed",
      "description": "Public BTX Feed content"
    },
    {
      "name": "account",
      "description": "Account, wallet, and balance data"
    },
    {
      "name": "trading",
      "description": "Order, cancel, and fill endpoints"
    },
    {
      "name": "stream",
      "description": "Public market and authenticated user WebSocket streams"
    }
  ],
  "security": [],
  "paths": {
    "/health": {
      "get": {
        "tags": [
          "system"
        ],
        "operationId": "health",
        "summary": "서비스 상태",
        "responses": {
          "200": {
            "description": "Service is alive"
          }
        }
      }
    },
    "/ready": {
      "get": {
        "tags": [
          "system"
        ],
        "operationId": "readiness",
        "summary": "서비스 준비 상태",
        "description": "Checks database access plus the Core and engine connector wiring required by the external trading API.",
        "responses": {
          "200": {
            "$ref": "#/components/responses/ReadinessEnvelope"
          },
          "503": {
            "$ref": "#/components/responses/ErrorEnvelope"
          }
        }
      }
    },
    "/v1/time": {
      "get": {
        "tags": [
          "system"
        ],
        "operationId": "getTime",
        "summary": "서버 시간",
        "responses": {
          "200": {
            "$ref": "#/components/responses/TimeEnvelope"
          }
        }
      }
    },
    "/v1/currencies": {
      "get": {
        "tags": [
          "public"
        ],
        "operationId": "listCurrencies",
        "summary": "통화 목록",
        "responses": {
          "200": {
            "$ref": "#/components/responses/CurrencyListEnvelope"
          }
        }
      }
    },
    "/v1/feed/home": {
      "get": {
        "tags": [
          "feed"
        ],
        "operationId": "getFeedHome",
        "summary": "Feed 홈",
        "responses": {
          "200": {
            "$ref": "#/components/responses/FeedHomeEnvelope"
          },
          "500": {
            "$ref": "#/components/responses/ErrorEnvelope"
          },
          "503": {
            "$ref": "#/components/responses/ErrorEnvelope"
          }
        }
      }
    },
    "/v1/feed/categories": {
      "get": {
        "tags": [
          "feed"
        ],
        "operationId": "listFeedCategories",
        "summary": "Feed 카테고리 목록",
        "responses": {
          "200": {
            "$ref": "#/components/responses/FeedCategoryListEnvelope"
          },
          "500": {
            "$ref": "#/components/responses/ErrorEnvelope"
          },
          "503": {
            "$ref": "#/components/responses/ErrorEnvelope"
          }
        }
      }
    },
    "/v1/feed/articles": {
      "get": {
        "tags": [
          "feed"
        ],
        "operationId": "listFeedArticles",
        "summary": "Feed 글 목록과 검색",
        "parameters": [
          {
            "$ref": "#/components/parameters/FeedCategoryIdQuery"
          },
          {
            "$ref": "#/components/parameters/FeedAuthorNameQuery"
          },
          {
            "$ref": "#/components/parameters/FeedSearchQuery"
          },
          {
            "$ref": "#/components/parameters/FeedSortQuery"
          },
          {
            "$ref": "#/components/parameters/FeedLimitQuery"
          },
          {
            "$ref": "#/components/parameters/FeedCursorQuery"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/FeedArticleListEnvelope"
          },
          "400": {
            "$ref": "#/components/responses/ErrorEnvelope"
          },
          "500": {
            "$ref": "#/components/responses/ErrorEnvelope"
          },
          "503": {
            "$ref": "#/components/responses/ErrorEnvelope"
          }
        }
      }
    },
    "/v1/feed/articles/{feedArticleId}": {
      "get": {
        "tags": [
          "feed"
        ],
        "operationId": "getFeedArticle",
        "summary": "Feed 글 상세",
        "description": "The response supplies canonicalKey and canonicalPath. The slug is presentation metadata and is not used for database lookup.",
        "parameters": [
          {
            "$ref": "#/components/parameters/FeedArticleId"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/FeedArticleDetailEnvelope"
          },
          "400": {
            "$ref": "#/components/responses/ErrorEnvelope"
          },
          "404": {
            "$ref": "#/components/responses/ErrorEnvelope"
          },
          "500": {
            "$ref": "#/components/responses/ErrorEnvelope"
          },
          "503": {
            "$ref": "#/components/responses/ErrorEnvelope"
          }
        }
      }
    },
    "/v1/feed/articles/{feedArticleId}/view": {
      "post": {
        "tags": [
          "feed"
        ],
        "operationId": "incrementFeedArticleView",
        "summary": "Feed 조회수 증가",
        "parameters": [
          {
            "$ref": "#/components/parameters/FeedArticleId"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/FeedViewCountEnvelope"
          },
          "400": {
            "$ref": "#/components/responses/ErrorEnvelope"
          },
          "404": {
            "$ref": "#/components/responses/ErrorEnvelope"
          },
          "500": {
            "$ref": "#/components/responses/ErrorEnvelope"
          },
          "503": {
            "$ref": "#/components/responses/ErrorEnvelope"
          }
        }
      }
    },
    "/v1/markets": {
      "get": {
        "tags": [
          "public"
        ],
        "operationId": "listMarkets",
        "summary": "마켓 목록",
        "responses": {
          "200": {
            "$ref": "#/components/responses/MarketListEnvelope"
          }
        }
      }
    },
    "/v1/markets/{symbol}": {
      "get": {
        "tags": [
          "public"
        ],
        "operationId": "getMarket",
        "summary": "마켓 상세",
        "parameters": [
          {
            "$ref": "#/components/parameters/Symbol"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/MarketEnvelope"
          }
        }
      }
    },
    "/v1/market/ticker": {
      "get": {
        "tags": [
          "public"
        ],
        "operationId": "getTicker",
        "summary": "현재 시세",
        "parameters": [
          {
            "$ref": "#/components/parameters/SymbolQuery"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/TickerEnvelope"
          }
        }
      }
    },
    "/v1/market/stream": {
      "get": {
        "tags": [
          "stream"
        ],
        "operationId": "openMarketStream",
        "summary": "공개 시세 WebSocket 연결",
        "description": "Public event stream with dynamic subscribe and unsubscribe commands. Ticker is the first supported channel; the command envelope is designed for additional public market channels. Data-event sequence numbers are contiguous and scoped to one connection.",
        "servers": [
          {
            "url": "wss://api-ws.btxpro.co.kr",
            "description": "Production external WebSocket"
          },
          {
            "url": "ws://localhost:10006",
            "description": "Local external WebSocket"
          },
          {
            "url": "wss://realtime-staging.dovewallet.kr",
            "description": "Staging external WebSocket"
          }
        ],
        "x-websocket-client-messages": {
          "subscribe": {
            "$ref": "#/components/schemas/MarketStreamCommand"
          },
          "unsubscribe": {
            "$ref": "#/components/schemas/MarketStreamCommand"
          }
        },
        "x-websocket-events": {
          "subscribed": {
            "$ref": "#/components/schemas/MarketStreamSubscriptionAck"
          },
          "unsubscribed": {
            "$ref": "#/components/schemas/MarketStreamSubscriptionAck"
          },
          "ticker": {
            "$ref": "#/components/schemas/MarketStreamTickerEvent"
          },
          "error": {
            "$ref": "#/components/schemas/MarketStreamErrorEvent"
          }
        },
        "x-websocket-close-codes": {
          "1001": "Gateway shutdown",
          "1008": "Command rate limit exceeded",
          "1013": "Per-client event buffer overflow"
        },
        "responses": {
          "101": {
            "description": "Switching Protocols"
          }
        }
      }
    },
    "/v1/market/orderbook": {
      "get": {
        "tags": [
          "public"
        ],
        "operationId": "getOrderBook",
        "summary": "호가",
        "parameters": [
          {
            "$ref": "#/components/parameters/RequiredSymbolQuery"
          },
          {
            "$ref": "#/components/parameters/TickQuery"
          },
          {
            "$ref": "#/components/parameters/LimitQuery"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/OrderBookEnvelope"
          }
        }
      }
    },
    "/v1/market/trades": {
      "get": {
        "tags": [
          "public"
        ],
        "operationId": "getTrades",
        "summary": "최근 체결",
        "parameters": [
          {
            "$ref": "#/components/parameters/RequiredSymbolQuery"
          },
          {
            "$ref": "#/components/parameters/LimitQuery"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/TradeListEnvelope"
          }
        }
      }
    },
    "/v1/market/candles": {
      "get": {
        "tags": [
          "public"
        ],
        "operationId": "getCandles",
        "summary": "캔들",
        "parameters": [
          {
            "$ref": "#/components/parameters/RequiredSymbolQuery"
          },
          {
            "$ref": "#/components/parameters/IntervalQuery"
          },
          {
            "$ref": "#/components/parameters/CandleLimitQuery"
          },
          {
            "$ref": "#/components/parameters/StartTimeQuery"
          },
          {
            "$ref": "#/components/parameters/EndTimeQuery"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/CandleListEnvelope"
          }
        }
      }
    },
    "/v1/account": {
      "get": {
        "tags": [
          "account"
        ],
        "operationId": "getAccount",
        "summary": "계정과 API 키 권한",
        "security": [
          {
            "BTXApiKey": [],
            "BTXTimestamp": [],
            "BTXSignature": []
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/AccountEnvelope"
          }
        }
      }
    },
    "/v1/wallets": {
      "get": {
        "tags": [
          "account"
        ],
        "operationId": "listWallets",
        "summary": "지갑 목록",
        "security": [
          {
            "BTXApiKey": [],
            "BTXTimestamp": [],
            "BTXSignature": []
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/WalletListEnvelope"
          }
        }
      }
    },
    "/v1/balances": {
      "get": {
        "tags": [
          "account"
        ],
        "operationId": "listBalances",
        "summary": "잔고 목록",
        "parameters": [
          {
            "$ref": "#/components/parameters/WalletIdQuery"
          },
          {
            "$ref": "#/components/parameters/CurrencyQuery"
          }
        ],
        "security": [
          {
            "BTXApiKey": [],
            "BTXTimestamp": [],
            "BTXSignature": []
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/BalanceListEnvelope"
          }
        }
      }
    },
    "/v1/orders": {
      "post": {
        "tags": [
          "trading"
        ],
        "operationId": "createOrder",
        "summary": "지정가 주문 생성",
        "description": "The gateway correlates the engine result through a shared in-memory dispatcher and waits up to 10 seconds for this REST request. Market orders, post-only, quote quantity, and non-GTC time-in-force values are reserved for future support.",
        "security": [
          {
            "BTXApiKey": [],
            "BTXTimestamp": [],
            "BTXSignature": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateOrderRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/OrderEnvelope"
          },
          "422": {
            "$ref": "#/components/responses/ErrorEnvelope"
          },
          "504": {
            "$ref": "#/components/responses/ErrorEnvelope"
          }
        }
      },
      "delete": {
        "tags": [
          "trading"
        ],
        "operationId": "cancelOrders",
        "summary": "지갑의 주문 일괄 취소",
        "description": "Matching cancels run with up to 16 concurrent engine commands, preserve selection order in the response, and share one 10-second deadline.",
        "parameters": [
          {
            "$ref": "#/components/parameters/RequiredWalletIdQuery"
          },
          {
            "$ref": "#/components/parameters/SymbolQuery"
          },
          {
            "$ref": "#/components/parameters/LimitQuery"
          }
        ],
        "security": [
          {
            "BTXApiKey": [],
            "BTXTimestamp": [],
            "BTXSignature": []
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/CancelOrderListEnvelope"
          },
          "504": {
            "$ref": "#/components/responses/ErrorEnvelope"
          }
        }
      }
    },
    "/v1/orders/open": {
      "get": {
        "tags": [
          "trading"
        ],
        "operationId": "listOpenOrders",
        "summary": "미체결 주문 목록",
        "parameters": [
          {
            "$ref": "#/components/parameters/WalletIdQuery"
          },
          {
            "$ref": "#/components/parameters/SymbolQuery"
          },
          {
            "$ref": "#/components/parameters/LimitQuery"
          }
        ],
        "security": [
          {
            "BTXApiKey": [],
            "BTXTimestamp": [],
            "BTXSignature": []
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/OrderListEnvelope"
          }
        }
      }
    },
    "/v1/orders/history": {
      "get": {
        "tags": [
          "trading"
        ],
        "operationId": "listOrderHistory",
        "summary": "주문 이력",
        "parameters": [
          {
            "$ref": "#/components/parameters/WalletIdQuery"
          },
          {
            "$ref": "#/components/parameters/SymbolQuery"
          },
          {
            "$ref": "#/components/parameters/LimitQuery"
          },
          {
            "$ref": "#/components/parameters/StartTimeQuery"
          },
          {
            "$ref": "#/components/parameters/EndTimeQuery"
          }
        ],
        "security": [
          {
            "BTXApiKey": [],
            "BTXTimestamp": [],
            "BTXSignature": []
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/OrderListEnvelope"
          }
        }
      }
    },
    "/v1/orders/{orderId}": {
      "get": {
        "tags": [
          "trading"
        ],
        "operationId": "getOrder",
        "summary": "주문 상세",
        "parameters": [
          {
            "$ref": "#/components/parameters/OrderId"
          }
        ],
        "security": [
          {
            "BTXApiKey": [],
            "BTXTimestamp": [],
            "BTXSignature": []
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/OrderEnvelope"
          }
        }
      },
      "delete": {
        "tags": [
          "trading"
        ],
        "operationId": "cancelOrder",
        "summary": "주문 취소",
        "parameters": [
          {
            "$ref": "#/components/parameters/OrderId"
          },
          {
            "$ref": "#/components/parameters/WalletIdQuery"
          },
          {
            "$ref": "#/components/parameters/SymbolQuery"
          }
        ],
        "security": [
          {
            "BTXApiKey": [],
            "BTXTimestamp": [],
            "BTXSignature": []
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/OrderEnvelope"
          },
          "422": {
            "$ref": "#/components/responses/ErrorEnvelope"
          },
          "504": {
            "$ref": "#/components/responses/ErrorEnvelope"
          }
        }
      }
    },
    "/v1/fills": {
      "get": {
        "tags": [
          "trading"
        ],
        "operationId": "listFills",
        "summary": "체결 이력",
        "parameters": [
          {
            "$ref": "#/components/parameters/WalletIdQuery"
          },
          {
            "$ref": "#/components/parameters/SymbolQuery"
          },
          {
            "$ref": "#/components/parameters/LimitQuery"
          },
          {
            "$ref": "#/components/parameters/StartTimeQuery"
          },
          {
            "$ref": "#/components/parameters/EndTimeQuery"
          }
        ],
        "security": [
          {
            "BTXApiKey": [],
            "BTXTimestamp": [],
            "BTXSignature": []
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/FillListEnvelope"
          }
        }
      }
    },
    "/v1/user/stream": {
      "get": {
        "tags": [
          "stream"
        ],
        "operationId": "openUserStream",
        "summary": "개인 WebSocket 연결",
        "description": "Full-duplex authenticated session. The first server frame is a snapshot with sequence 0. Subsequent order, fill, and balance frames use a contiguous sequence scoped to this connection. Client order commands and their id-correlated responses do not consume event sequence numbers. Reconnect and consume a new snapshot after any disconnect, then use REST /v1/fills to reconcile executions that may have occurred while disconnected.",
        "servers": [
          {
            "url": "wss://api-ws.btxpro.co.kr",
            "description": "Production external WebSocket"
          },
          {
            "url": "ws://localhost:10006",
            "description": "Local external WebSocket"
          },
          {
            "url": "wss://realtime-staging.dovewallet.kr",
            "description": "Staging external WebSocket"
          }
        ],
        "x-websocket-events": {
          "snapshot": {
            "$ref": "#/components/schemas/UserStreamSnapshotEvent"
          },
          "order": {
            "$ref": "#/components/schemas/UserStreamOrderEvent"
          },
          "fill": {
            "$ref": "#/components/schemas/UserStreamFillEvent"
          },
          "balance": {
            "$ref": "#/components/schemas/UserStreamBalanceEvent"
          },
          "response": {
            "$ref": "#/components/schemas/UserStreamCommandResponse"
          },
          "error": {
            "$ref": "#/components/schemas/UserStreamCommandError"
          }
        },
        "x-websocket-client-messages": {
          "order.create": {
            "$ref": "#/components/schemas/UserStreamCreateOrderCommand"
          },
          "order.cancel": {
            "$ref": "#/components/schemas/UserStreamCancelOrderCommand"
          },
          "order.amend": {
            "$ref": "#/components/schemas/UserStreamAmendOrderCommand"
          }
        },
        "security": [
          {
            "BTXApiKey": [],
            "BTXTimestamp": [],
            "BTXSignature": []
          }
        ],
        "responses": {
          "101": {
            "description": "Switching Protocols"
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "Symbol": {
        "name": "symbol",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "example": "BTC-USDT"
        }
      },
      "OrderId": {
        "name": "orderId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "pattern": "^[1-9][0-9]*$",
          "example": "987654"
        }
      },
      "FeedArticleId": {
        "name": "feedArticleId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "pattern": "^[1-9][0-9]*$",
          "example": "1784685300000000001"
        }
      },
      "FeedCategoryIdQuery": {
        "name": "categoryId",
        "in": "query",
        "required": false,
        "schema": {
          "type": "string",
          "pattern": "^[1-9][0-9]*$",
          "example": "1784685300000000100"
        }
      },
      "FeedAuthorNameQuery": {
        "name": "authorName",
        "in": "query",
        "required": false,
        "schema": {
          "type": "string",
          "minLength": 1,
          "maxLength": 80,
          "example": "BTX Team"
        }
      },
      "FeedSearchQuery": {
        "name": "q",
        "in": "query",
        "required": false,
        "description": "Search title, summary, and Markdown body. Whitespace is normalized and each term is matched as a substring; an article must contain every term. Terms shorter than 2 characters and boolean operator characters (+-><()~*\"@) are ignored, and a query left with no searchable term is rejected. Search results are globally limited and ordered by title match, summary-only match, then body-only match; sort and cursor cannot be combined with q.",
        "schema": {
          "type": "string",
          "minLength": 2,
          "maxLength": 80,
          "example": "비트코인"
        }
      },
      "FeedSortQuery": {
        "name": "sort",
        "in": "query",
        "required": false,
        "description": "Cannot be combined with q.",
        "schema": {
          "type": "string",
          "enum": [
            "latest",
            "popular"
          ],
          "default": "latest"
        }
      },
      "FeedLimitQuery": {
        "name": "limit",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 20
        }
      },
      "FeedCursorQuery": {
        "name": "cursor",
        "in": "query",
        "required": false,
        "description": "Opaque keyset cursor returned as nextCursor. A cursor is bound to its latest or popular sort and cannot be combined with q.",
        "schema": {
          "type": "string",
          "minLength": 1,
          "maxLength": 512
        }
      },
      "WalletIdQuery": {
        "name": "walletId",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 255,
          "example": 21
        }
      },
      "RequiredWalletIdQuery": {
        "name": "walletId",
        "in": "query",
        "required": true,
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 255,
          "example": 21
        }
      },
      "SymbolQuery": {
        "name": "symbol",
        "in": "query",
        "required": false,
        "schema": {
          "type": "string",
          "example": "BTC-USDT"
        }
      },
      "RequiredSymbolQuery": {
        "name": "symbol",
        "in": "query",
        "required": true,
        "schema": {
          "type": "string",
          "example": "BTC-USDT"
        }
      },
      "LimitQuery": {
        "name": "limit",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000,
          "default": 100
        }
      },
      "CandleLimitQuery": {
        "name": "limit",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000,
          "default": 500
        }
      },
      "TickQuery": {
        "name": "tick",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 0,
          "maximum": 4,
          "default": 0
        }
      },
      "IntervalQuery": {
        "name": "interval",
        "in": "query",
        "required": false,
        "schema": {
          "type": "string",
          "enum": [
            "1m",
            "5m",
            "10m",
            "15m",
            "30m",
            "1h",
            "4h",
            "1d",
            "1w"
          ],
          "default": "1h"
        }
      },
      "StartTimeQuery": {
        "name": "startTime",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "format": "int64",
          "minimum": 0,
          "description": "Inclusive Unix time in milliseconds."
        }
      },
      "EndTimeQuery": {
        "name": "endTime",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "format": "int64",
          "minimum": 1,
          "description": "Exclusive Unix time in milliseconds."
        }
      },
      "CurrencyQuery": {
        "name": "currency",
        "in": "query",
        "required": false,
        "schema": {
          "type": "string",
          "example": "BTC"
        }
      }
    },
    "schemas": {
      "Time": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "time"
        ],
        "properties": {
          "time": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "Readiness": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "status"
        ],
        "properties": {
          "status": {
            "type": "string",
            "const": "ready"
          }
        }
      },
      "Currency": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "currencyId",
          "symbol",
          "status",
          "major",
          "maxPrecision",
          "depositEnabled",
          "withdrawalEnabled",
          "transferEnabled",
          "tradeEnabled"
        ],
        "properties": {
          "currencyId": {
            "type": "integer"
          },
          "symbol": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "major": {
            "type": "boolean"
          },
          "maxPrecision": {
            "type": "integer"
          },
          "depositEnabled": {
            "type": "boolean"
          },
          "withdrawalEnabled": {
            "type": "boolean"
          },
          "transferEnabled": {
            "type": "boolean"
          },
          "tradeEnabled": {
            "type": "boolean"
          }
        }
      },
      "CurrencyList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Currency"
            }
          }
        }
      },
      "FeedCategory": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "slug",
          "name",
          "description",
          "displayOrder",
          "creationMicrotime",
          "updateMicrotime"
        ],
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[0-9]+$"
          },
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "displayOrder": {
            "type": "integer",
            "minimum": 0
          },
          "creationMicrotime": {
            "type": "integer",
            "format": "int64"
          },
          "updateMicrotime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "FeedCategoryList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FeedCategory"
            }
          }
        }
      },
      "FeedArticleSummary": {
        "type": "object",
        "required": [
          "id",
          "canonicalKey",
          "canonicalPath",
          "categoryId",
          "categorySlug",
          "categoryName",
          "lang",
          "slug",
          "title",
          "summary",
          "thumbnailUrl",
          "readingMinutes",
          "authorName",
          "viewCount",
          "publishedMicrotime",
          "creationMicrotime",
          "updateMicrotime"
        ],
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[1-9][0-9]*$"
          },
          "canonicalKey": {
            "type": "string",
            "description": "{id}-{slug}"
          },
          "canonicalPath": {
            "type": "string",
            "description": "/feed/{id}-{slug}"
          },
          "categoryId": {
            "type": "string",
            "pattern": "^[0-9]+$"
          },
          "categorySlug": {
            "type": "string"
          },
          "categoryName": {
            "type": "string"
          },
          "lang": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "thumbnailUrl": {
            "type": "string"
          },
          "readingMinutes": {
            "type": "integer",
            "minimum": 1,
            "description": "Estimated reading time in minutes, stored when the article is saved."
          },
          "authorName": {
            "type": "string"
          },
          "viewCount": {
            "type": "integer",
            "minimum": 0
          },
          "publishedMicrotime": {
            "type": "integer",
            "format": "int64"
          },
          "creationMicrotime": {
            "type": "integer",
            "format": "int64"
          },
          "updateMicrotime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "FeedArticleDetail": {
        "type": "object",
        "unevaluatedProperties": false,
        "allOf": [
          {
            "$ref": "#/components/schemas/FeedArticleSummary"
          },
          {
            "type": "object",
            "required": [
              "contentMarkdown"
            ],
            "properties": {
              "contentMarkdown": {
                "type": "string"
              }
            }
          }
        ]
      },
      "FeedArticleList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items",
          "sort",
          "hasMore",
          "nextCursor"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FeedArticleSummary"
            }
          },
          "sort": {
            "type": "string",
            "enum": [
              "latest",
              "popular",
              "search"
            ]
          },
          "hasMore": {
            "type": "boolean"
          },
          "nextCursor": {
            "type": "string",
            "description": "Empty when hasMore is false."
          }
        }
      },
      "FeedHome": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "featured",
          "latest",
          "popular",
          "categories"
        ],
        "properties": {
          "featured": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/FeedArticleSummary"
              },
              {
                "type": "null"
              }
            ]
          },
          "latest": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FeedArticleSummary"
            }
          },
          "popular": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FeedArticleSummary"
            }
          },
          "categories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FeedCategory"
            }
          }
        }
      },
      "FeedViewCount": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "viewCount"
        ],
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[1-9][0-9]*$"
          },
          "viewCount": {
            "type": "integer",
            "minimum": 1
          }
        }
      },
      "Market": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "symbol",
          "baseCurrency",
          "quoteCurrency",
          "baseCurrencyId",
          "quoteCurrencyId",
          "status",
          "pricePrecision",
          "quantityPrecision",
          "minQuantity",
          "minNotional"
        ],
        "properties": {
          "symbol": {
            "type": "string"
          },
          "baseCurrency": {
            "type": "string"
          },
          "quoteCurrency": {
            "type": "string"
          },
          "baseCurrencyId": {
            "type": "integer"
          },
          "quoteCurrencyId": {
            "type": "integer"
          },
          "status": {
            "type": "string"
          },
          "pricePrecision": {
            "type": "integer"
          },
          "quantityPrecision": {
            "type": "integer"
          },
          "minQuantity": {
            "type": "string"
          },
          "minNotional": {
            "type": "string"
          }
        }
      },
      "MarketList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Market"
            }
          }
        }
      },
      "Ticker": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "symbol",
          "baseCurrencyId",
          "quoteCurrencyId",
          "lastPrice",
          "priceChange",
          "priceChangeRate",
          "high",
          "low",
          "volume",
          "quoteVolume",
          "time"
        ],
        "properties": {
          "symbol": {
            "type": "string"
          },
          "baseCurrencyId": {
            "type": "integer"
          },
          "quoteCurrencyId": {
            "type": "integer"
          },
          "lastPrice": {
            "type": "string"
          },
          "priceChange": {
            "type": "string"
          },
          "priceChangeRate": {
            "type": "string"
          },
          "high": {
            "type": "string"
          },
          "low": {
            "type": "string"
          },
          "volume": {
            "type": "string"
          },
          "quoteVolume": {
            "type": "string"
          },
          "time": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "TickerList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Ticker"
            }
          }
        }
      },
      "TickerData": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/Ticker"
          },
          {
            "$ref": "#/components/schemas/TickerList"
          }
        ]
      },
      "MarketStreamArg": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "channel",
          "symbol"
        ],
        "properties": {
          "channel": {
            "type": "string",
            "enum": [
              "ticker"
            ]
          },
          "symbol": {
            "oneOf": [
              {
                "type": "string",
                "const": "*"
              },
              {
                "type": "string",
                "pattern": "^[A-Za-z0-9]+-[A-Za-z0-9]+$",
                "example": "BTC-USDT"
              }
            ]
          }
        }
      },
      "MarketStreamCommand": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "op",
          "args"
        ],
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "pattern": "^[A-Za-z0-9._:-]+$"
          },
          "op": {
            "type": "string",
            "enum": [
              "subscribe",
              "unsubscribe"
            ]
          },
          "args": {
            "type": "array",
            "minItems": 1,
            "maxItems": 100,
            "items": {
              "$ref": "#/components/schemas/MarketStreamArg"
            }
          }
        }
      },
      "MarketStreamSubscriptionAck": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "event",
          "id",
          "args",
          "serverTime"
        ],
        "properties": {
          "event": {
            "type": "string",
            "enum": [
              "subscribed",
              "unsubscribed"
            ]
          },
          "id": {
            "type": "string"
          },
          "args": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MarketStreamArg"
            }
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "MarketStreamTickerEvent": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "event",
          "sequence",
          "arg",
          "data",
          "serverTime"
        ],
        "properties": {
          "event": {
            "type": "string",
            "const": "ticker"
          },
          "sequence": {
            "type": "integer",
            "format": "uint64",
            "minimum": 1,
            "description": "Contiguous sequence across all data channels on this connection."
          },
          "arg": {
            "$ref": "#/components/schemas/MarketStreamArg"
          },
          "data": {
            "$ref": "#/components/schemas/Ticker"
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "MarketStreamErrorEvent": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "event",
          "error",
          "serverTime"
        ],
        "properties": {
          "event": {
            "type": "string",
            "const": "error"
          },
          "id": {
            "type": "string",
            "description": "Command id when it could be parsed safely."
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "OrderBookLevel": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "price",
          "quantity"
        ],
        "properties": {
          "price": {
            "type": "string"
          },
          "quantity": {
            "type": "string"
          }
        }
      },
      "OrderBook": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "symbol",
          "tick",
          "bids",
          "asks",
          "time"
        ],
        "properties": {
          "symbol": {
            "type": "string"
          },
          "tick": {
            "type": "integer",
            "minimum": 0,
            "maximum": 4
          },
          "bids": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrderBookLevel"
            }
          },
          "asks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OrderBookLevel"
            }
          },
          "time": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "Trade": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "tradeId",
          "symbol",
          "side",
          "price",
          "quantity",
          "time",
          "microtime"
        ],
        "properties": {
          "tradeId": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          },
          "side": {
            "type": "string",
            "enum": [
              "buy",
              "sell",
              "unknown"
            ]
          },
          "price": {
            "type": "string"
          },
          "quantity": {
            "type": "string"
          },
          "time": {
            "type": "integer",
            "format": "int64"
          },
          "microtime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "TradeList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Trade"
            }
          }
        }
      },
      "Candle": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "openTime",
          "closeTime",
          "open",
          "high",
          "low",
          "close",
          "volume",
          "quoteVolume"
        ],
        "properties": {
          "openTime": {
            "type": "integer",
            "format": "int64"
          },
          "closeTime": {
            "type": "integer",
            "format": "int64"
          },
          "open": {
            "type": "string"
          },
          "high": {
            "type": "string"
          },
          "low": {
            "type": "string"
          },
          "close": {
            "type": "string"
          },
          "volume": {
            "type": "string"
          },
          "quoteVolume": {
            "type": "string"
          }
        }
      },
      "CandleList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "symbol",
          "interval",
          "items",
          "hasMore"
        ],
        "properties": {
          "symbol": {
            "type": "string"
          },
          "interval": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Candle"
            }
          },
          "hasMore": {
            "type": "boolean"
          }
        }
      },
      "AccountPermissions": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "read",
          "trade",
          "withdraw",
          "write"
        ],
        "properties": {
          "read": {
            "type": "boolean"
          },
          "trade": {
            "type": "boolean"
          },
          "withdraw": {
            "type": "boolean"
          },
          "write": {
            "type": "boolean"
          }
        }
      },
      "Account": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "accountId",
          "apiKeyId",
          "publicKey",
          "permissions",
          "createdAt"
        ],
        "properties": {
          "accountId": {
            "type": "integer",
            "format": "uint64"
          },
          "apiKeyId": {
            "type": "integer",
            "format": "uint64"
          },
          "publicKey": {
            "type": "string"
          },
          "permissions": {
            "$ref": "#/components/schemas/AccountPermissions"
          },
          "createdAt": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "Wallet": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "walletId",
          "type",
          "name",
          "favorite",
          "criteriaCurrencyId",
          "incoming",
          "outgoing",
          "createdAt",
          "updatedAt"
        ],
        "properties": {
          "walletId": {
            "type": "integer"
          },
          "type": {
            "type": "string",
            "enum": [
              "general",
              "spotTrade",
              "unknown"
            ]
          },
          "name": {
            "type": "string"
          },
          "favorite": {
            "type": "boolean"
          },
          "criteriaCurrency": {
            "type": "string"
          },
          "criteriaCurrencyId": {
            "type": "integer"
          },
          "incoming": {
            "type": "integer"
          },
          "outgoing": {
            "type": "integer"
          },
          "createdAt": {
            "type": "integer",
            "format": "int64"
          },
          "updatedAt": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "WalletList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "wallets"
        ],
        "properties": {
          "wallets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Wallet"
            }
          }
        }
      },
      "Balance": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "walletId",
          "currency",
          "currencyId",
          "available",
          "inUse",
          "total",
          "updatedAt"
        ],
        "properties": {
          "walletId": {
            "type": "integer"
          },
          "currency": {
            "type": "string"
          },
          "currencyId": {
            "type": "integer"
          },
          "available": {
            "type": "string"
          },
          "inUse": {
            "type": "string"
          },
          "total": {
            "type": "string"
          },
          "updatedAt": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "BalanceList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "balances"
        ],
        "properties": {
          "balances": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Balance"
            }
          }
        }
      },
      "Fill": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "fillId",
          "orderId",
          "walletId",
          "side",
          "type",
          "liquidity",
          "price",
          "quantity",
          "quoteQuantity",
          "baseCurrencyId",
          "quoteCurrencyId",
          "time",
          "microtime"
        ],
        "properties": {
          "fillId": {
            "type": "string"
          },
          "orderId": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          },
          "walletId": {
            "type": "integer"
          },
          "side": {
            "type": "string",
            "enum": [
              "buy",
              "sell",
              "unknown"
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "limit",
              "unknown"
            ]
          },
          "liquidity": {
            "type": "string",
            "enum": [
              "maker",
              "taker"
            ]
          },
          "price": {
            "type": "string"
          },
          "quantity": {
            "type": "string"
          },
          "quoteQuantity": {
            "type": "string"
          },
          "baseCurrencyId": {
            "type": "integer"
          },
          "quoteCurrencyId": {
            "type": "integer"
          },
          "time": {
            "type": "integer",
            "format": "int64"
          },
          "microtime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "FillList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items",
          "hasMore"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Fill"
            }
          },
          "hasMore": {
            "type": "boolean"
          }
        }
      },
      "UserStreamSnapshot": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "orders",
          "ordersHasMore",
          "balances"
        ],
        "properties": {
          "orders": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Order"
            },
            "description": "Open spot orders visible to the API key."
          },
          "ordersHasMore": {
            "type": "boolean",
            "description": "True when more than 1000 open orders were visible at snapshot time."
          },
          "balances": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Balance"
            },
            "description": "Current balances for every wallet visible to the API key."
          }
        }
      },
      "UserStreamSnapshotEvent": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "event",
          "sequence",
          "data",
          "serverTime"
        ],
        "properties": {
          "event": {
            "type": "string",
            "const": "snapshot"
          },
          "sequence": {
            "type": "integer",
            "format": "uint64",
            "const": 0,
            "description": "A snapshot always starts a new connection at sequence 0."
          },
          "data": {
            "$ref": "#/components/schemas/UserStreamSnapshot"
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "UserStreamOrderEvent": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "event",
          "updateType",
          "sequence",
          "data",
          "serverTime"
        ],
        "properties": {
          "event": {
            "type": "string",
            "const": "order"
          },
          "updateType": {
            "type": "string",
            "enum": [
              "open",
              "partiallyFilled",
              "filled",
              "canceled",
              "unknown"
            ],
            "description": "The absolute lifecycle state represented by this update."
          },
          "sequence": {
            "type": "integer",
            "format": "uint64",
            "minimum": 1,
            "description": "Contiguous sequence scoped to this WebSocket connection."
          },
          "data": {
            "$ref": "#/components/schemas/Order"
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "UserStreamFill": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "executionId",
          "orderId",
          "walletId",
          "side",
          "type",
          "liquidity",
          "price",
          "quantity",
          "quoteQuantity",
          "cumulativeQuantity",
          "cumulativeQuoteQuantity",
          "cumulativeFee",
          "aggregated",
          "baseCurrencyId",
          "quoteCurrencyId",
          "time",
          "microtime"
        ],
        "properties": {
          "executionId": {
            "type": "string",
            "example": "987654:0.040000000",
            "description": "Opaque realtime deduplication id derived from order id and cumulative filled quantity. It is not the REST fillId."
          },
          "orderId": {
            "type": "string",
            "example": "987654"
          },
          "symbol": {
            "type": "string",
            "example": "BTC-USDT"
          },
          "walletId": {
            "type": "integer"
          },
          "side": {
            "type": "string",
            "enum": [
              "buy",
              "sell",
              "unknown"
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "limit",
              "unknown"
            ]
          },
          "liquidity": {
            "type": "string",
            "enum": [
              "maker",
              "taker"
            ]
          },
          "price": {
            "type": "string",
            "example": "65000.000000000",
            "description": "Execution price, or the weighted-average price when aggregated is true."
          },
          "quantity": {
            "type": "string",
            "example": "0.010000000"
          },
          "quoteQuantity": {
            "type": "string",
            "example": "650.000000000"
          },
          "cumulativeQuantity": {
            "type": "string",
            "example": "0.040000000"
          },
          "cumulativeQuoteQuantity": {
            "type": "string",
            "example": "2600.000000000"
          },
          "cumulativeFee": {
            "type": "string",
            "example": "0.001000000",
            "description": "Order-level cumulative fee, not the fee delta for this event."
          },
          "aggregated": {
            "type": "boolean",
            "description": "True when this realtime event can represent more than one underlying match."
          },
          "baseCurrencyId": {
            "type": "integer"
          },
          "quoteCurrencyId": {
            "type": "integer"
          },
          "time": {
            "type": "integer",
            "format": "int64"
          },
          "microtime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "UserStreamFillEvent": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "event",
          "sequence",
          "data",
          "serverTime"
        ],
        "properties": {
          "event": {
            "type": "string",
            "const": "fill"
          },
          "sequence": {
            "type": "integer",
            "format": "uint64",
            "minimum": 1,
            "description": "Contiguous sequence scoped to this WebSocket connection."
          },
          "data": {
            "$ref": "#/components/schemas/UserStreamFill"
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "UserStreamBalanceEvent": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "event",
          "sequence",
          "data",
          "serverTime"
        ],
        "properties": {
          "event": {
            "type": "string",
            "const": "balance"
          },
          "sequence": {
            "type": "integer",
            "format": "uint64",
            "minimum": 1,
            "description": "Contiguous sequence scoped to this WebSocket connection."
          },
          "data": {
            "$ref": "#/components/schemas/Balance"
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "UserStreamCommandId": {
        "type": "string",
        "minLength": 1,
        "maxLength": 64,
        "pattern": "^[A-Za-z0-9._:-]+$",
        "description": "Client correlation id. It is not an order idempotency key."
      },
      "UserStreamCreateOrderCommand": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "op",
          "args"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/UserStreamCommandId"
          },
          "op": {
            "type": "string",
            "const": "order.create"
          },
          "args": {
            "$ref": "#/components/schemas/CreateOrderRequest"
          }
        }
      },
      "UserStreamCancelOrderArgs": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "orderId"
        ],
        "properties": {
          "orderId": {
            "type": "string",
            "pattern": "^[1-9][0-9]*$"
          }
        }
      },
      "UserStreamCancelOrderCommand": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "op",
          "args"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/UserStreamCommandId"
          },
          "op": {
            "type": "string",
            "const": "order.cancel"
          },
          "args": {
            "$ref": "#/components/schemas/UserStreamCancelOrderArgs"
          }
        }
      },
      "UserStreamAmendOrderArgs": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "orderId"
        ],
        "properties": {
          "orderId": {
            "type": "string",
            "pattern": "^[1-9][0-9]*$"
          },
          "quantity": {
            "type": "string"
          },
          "price": {
            "type": "string"
          }
        },
        "anyOf": [
          {
            "required": [
              "quantity"
            ]
          },
          {
            "required": [
              "price"
            ]
          }
        ]
      },
      "UserStreamAmendOrderCommand": {
        "type": "object",
        "additionalProperties": false,
        "description": "Reserved native amend command. Current servers return AMEND_NOT_SUPPORTED without canceling the original order.",
        "required": [
          "id",
          "op",
          "args"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/UserStreamCommandId"
          },
          "op": {
            "type": "string",
            "const": "order.amend"
          },
          "args": {
            "$ref": "#/components/schemas/UserStreamAmendOrderArgs"
          }
        }
      },
      "UserStreamCommandResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "event",
          "id",
          "op",
          "data",
          "serverTime"
        ],
        "properties": {
          "event": {
            "type": "string",
            "const": "response"
          },
          "id": {
            "$ref": "#/components/schemas/UserStreamCommandId"
          },
          "op": {
            "type": "string",
            "enum": [
              "order.create",
              "order.cancel",
              "order.amend"
            ]
          },
          "data": {
            "$ref": "#/components/schemas/Order"
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "UserStreamCommandError": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "event",
          "id",
          "error",
          "serverTime"
        ],
        "properties": {
          "event": {
            "type": "string",
            "const": "error"
          },
          "id": {
            "type": "string",
            "pattern": "^[A-Za-z0-9._:-]{0,64}$",
            "description": "Echoed command ID when valid; empty when a malformed/throttled packet has no usable ID."
          },
          "op": {
            "type": "string"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "CreateOrderRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "symbol",
          "walletId",
          "side",
          "type",
          "quantity",
          "price"
        ],
        "properties": {
          "symbol": {
            "type": "string",
            "example": "BTC-USDT"
          },
          "walletId": {
            "type": "integer",
            "minimum": 21,
            "maximum": 39,
            "description": "Required account-local visible spot-trading wallet ID from GET /v1/wallets; not a blockchain address or walletNumber. The server never chooses a default wallet.",
            "example": 21
          },
          "side": {
            "type": "string",
            "enum": [
              "buy",
              "sell"
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "limit"
            ]
          },
          "timeInForce": {
            "type": "string",
            "enum": [
              "GTC"
            ],
            "default": "GTC"
          },
          "quantity": {
            "type": "string",
            "example": "0.100000000"
          },
          "quoteQuantity": {
            "type": "string",
            "description": "Reserved for future support."
          },
          "price": {
            "type": "string",
            "example": "65000.000000000"
          },
          "postOnly": {
            "type": "boolean",
            "description": "Reserved for future support."
          }
        }
      },
      "Order": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "orderId",
          "walletId",
          "side",
          "type",
          "status",
          "price",
          "quantity",
          "filledQuantity",
          "remainingQuantity",
          "executedValue",
          "fee",
          "createdAt",
          "updatedAt",
          "baseCurrencyId",
          "quoteCurrencyId"
        ],
        "properties": {
          "orderId": {
            "type": "string",
            "pattern": "^[1-9][0-9]*$",
            "example": "987654"
          },
          "symbol": {
            "type": "string",
            "example": "BTC-USDT"
          },
          "walletId": {
            "type": "integer",
            "minimum": 1,
            "example": 21
          },
          "side": {
            "type": "string",
            "enum": [
              "buy",
              "sell",
              "unknown"
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "limit",
              "unknown"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "open",
              "partiallyFilled",
              "filled",
              "canceled",
              "unknown"
            ]
          },
          "price": {
            "type": "string",
            "example": "65000.000000000"
          },
          "quantity": {
            "type": "string",
            "example": "0.100000000"
          },
          "filledQuantity": {
            "type": "string",
            "example": "0.000000000"
          },
          "remainingQuantity": {
            "type": "string",
            "example": "0.100000000"
          },
          "executedValue": {
            "type": "string",
            "example": "0.000000000"
          },
          "fee": {
            "type": "string",
            "example": "0.000000000"
          },
          "createdAt": {
            "type": "integer",
            "format": "int64",
            "example": 1783420800123
          },
          "updatedAt": {
            "type": "integer",
            "format": "int64",
            "example": 1783420800123
          },
          "baseCurrencyId": {
            "type": "integer",
            "example": 1002
          },
          "quoteCurrencyId": {
            "type": "integer",
            "example": 1001
          }
        }
      },
      "OrderList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items",
          "hasMore"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Order"
            }
          },
          "hasMore": {
            "type": "boolean"
          }
        }
      },
      "CancelOrderItem": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "orderId",
          "status"
        ],
        "properties": {
          "orderId": {
            "type": "string",
            "pattern": "^[1-9][0-9]*$",
            "example": "987654"
          },
          "status": {
            "type": "string",
            "enum": [
              "canceled",
              "rejected"
            ]
          },
          "errorCode": {
            "type": "string",
            "example": "ENGINE_REJECTED_33"
          },
          "symbol": {
            "type": "string",
            "example": "BTC-USDT"
          },
          "walletId": {
            "type": "integer",
            "minimum": 1,
            "example": 21
          }
        }
      },
      "CancelOrderList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items",
          "hasMore"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CancelOrderItem"
            }
          },
          "hasMore": {
            "type": "boolean"
          }
        }
      },
      "Envelope": {
        "type": "object",
        "required": [
          "requestId",
          "serverTime"
        ],
        "properties": {
          "data": {},
          "error": {
            "$ref": "#/components/schemas/Error"
          },
          "requestId": {
            "type": "string"
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        }
      },
      "OrderEnvelope": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "data",
          "requestId",
          "serverTime"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Order"
          },
          "requestId": {
            "type": "string"
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "OrderListEnvelope": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "data",
          "requestId",
          "serverTime"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/OrderList"
          },
          "requestId": {
            "type": "string"
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "CancelOrderListEnvelope": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "data",
          "requestId",
          "serverTime"
        ],
        "properties": {
          "data": {
            "$ref": "#/components/schemas/CancelOrderList"
          },
          "requestId": {
            "type": "string"
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      },
      "ErrorEnvelope": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "error",
          "requestId",
          "serverTime"
        ],
        "properties": {
          "error": {
            "$ref": "#/components/schemas/Error"
          },
          "requestId": {
            "type": "string"
          },
          "serverTime": {
            "type": "integer",
            "format": "int64"
          }
        }
      }
    },
    "responses": {
      "TimeEnvelope": {
        "description": "Server time response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Time"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "ReadinessEnvelope": {
        "description": "Readiness response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Readiness"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "CurrencyListEnvelope": {
        "description": "Currency list response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CurrencyList"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "FeedHomeEnvelope": {
        "description": "Feed home response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FeedHome"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "FeedCategoryListEnvelope": {
        "description": "Feed category list response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FeedCategoryList"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "FeedArticleListEnvelope": {
        "description": "Feed article list response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FeedArticleList"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "FeedArticleDetailEnvelope": {
        "description": "Feed article detail response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FeedArticleDetail"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "FeedViewCountEnvelope": {
        "description": "Feed article view-count response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FeedViewCount"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "MarketListEnvelope": {
        "description": "Market list response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MarketList"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "MarketEnvelope": {
        "description": "Market response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Market"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "TickerEnvelope": {
        "description": "Ticker response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TickerData"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "OrderBookEnvelope": {
        "description": "Order book response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/OrderBook"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "TradeListEnvelope": {
        "description": "Public trade list response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TradeList"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "CandleListEnvelope": {
        "description": "Candle list response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CandleList"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "AccountEnvelope": {
        "description": "API account response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Account"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "WalletListEnvelope": {
        "description": "Wallet list response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/WalletList"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "BalanceListEnvelope": {
        "description": "Balance list response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/BalanceList"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "FillListEnvelope": {
        "description": "Fill list response envelope",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Envelope"
                },
                {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FillList"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "JSONEnvelope": {
        "description": "JSON response envelope",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Envelope"
            }
          }
        }
      },
      "OrderEnvelope": {
        "description": "Order response envelope",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/OrderEnvelope"
            }
          }
        }
      },
      "OrderListEnvelope": {
        "description": "Order list response envelope",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/OrderListEnvelope"
            }
          }
        }
      },
      "CancelOrderListEnvelope": {
        "description": "Bulk cancel response envelope",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/CancelOrderListEnvelope"
            }
          }
        }
      },
      "ErrorEnvelope": {
        "description": "Error response envelope",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      }
    },
    "securitySchemes": {
      "BTXApiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "BTX-API-KEY",
        "description": "API public key. Private requests also require timestamp and HMAC signature headers."
      },
      "BTXTimestamp": {
        "type": "apiKey",
        "in": "header",
        "name": "BTX-TIMESTAMP",
        "description": "Positive Unix milliseconds within BTX-RECV-WINDOW of server time."
      },
      "BTXSignature": {
        "type": "apiKey",
        "in": "header",
        "name": "BTX-SIGNATURE",
        "description": "Lowercase hexadecimal HMAC-SHA256 over the documented seven-line canonical request."
      },
      "BTXNonce": {
        "type": "apiKey",
        "in": "header",
        "name": "BTX-NONCE",
        "description": "Legacy optional signed metadata. Omit this header in new clients. If supplied on a mutation, it must be a positive integer; increasing values and database nonce updates are no longer required."
      }
    }
  }
}
