{
    "openapi": "3.1.0",
    "servers": [
        {
            "url": "https://api.novig.com",
            "description": "Production"
        },
        {
            "url": "https://api-qa.novig.us",
            "description": "QA"
        }
    ],
    "paths": {
        "/nbx/v2/emm/orders/place": {
            "post": {
                "operationId": "placeSingleOrder",
                "summary": "Place order",
                "description": "Place an order into the matching engine queue, conditional on validation. A successful response indicates that the order was placed in the queue, but does **not** guarantee that it will be filled or placed on the order book.\nTo reliably ensure that an order has been executed, consume messages from the matching tape to reconstruct the order book and other stateful structures.\n> **Note:** If an order placed wash trades against an order from the same user, both orders will wash fill each other and effectively be cancelled.\n\n**Rate limit:** 2048 requests per second.",
                "parameters": [],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/OrderRequestDto"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Order placed successfully"
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Orders"
                ],
                "x-code-samples": [
                    {
                        "lang": "bash",
                        "label": "cURL Example",
                        "source": "curl -X POST \"$API/emm/orders/place\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"outcomeId\": \"123e4567-e89b-12d3-a456-426614174000\",\n    \"price\": 0.125,\n    \"qty\": 4200,\n    \"currency\": COIN,\n    \"tif\": \"GTC\"\n}'"
                    }
                ]
            }
        },
        "/nbx/v2/emm/orders/batch": {
            "post": {
                "operationId": "placeMultipleOrders",
                "summary": "Place order batch",
                "description": "Submit multiple orders (maximum 1024) at once to be processed in a batch. This operation does not make guarantees about the successful execution of all orders, it only places each in the matching engine queue.\n\nWe book every order or none. We price each order on its own, not the batch total. We refuse the batch when your balance cannot cover its largest order by itself. The batch total may exceed your balance. Each order still needs collateral when it reaches the book, so we can reject an order after we book it.\n\n- `201`: we booked every order.\n- `422`: we booked no order. A balance refusal sets `code` to `INSUFFICIENT_BALANCE`. Its `errors` list each order your balance cannot cover on its own. `index` is the order's position in your request, counting from zero.\n\nYour order-volume budget is charged for the orders you send, not for the orders we book.\n\n**Rate limit:** 64 requests per second.",
                "parameters": [],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "array",
                                "items": {
                                    "$ref": "#/components/schemas/OrderRequestDto"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "We booked every order.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/OrderResponseDto"
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    },
                    "422": {
                        "description": "We booked no order. A balance refusal names each order your balance cannot cover in `errors`.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/BatchPlaceError"
                                }
                            }
                        }
                    }
                },
                "tags": [
                    "Orders"
                ]
            },
            "delete": {
                "operationId": "cancelMultipleOrders",
                "summary": "Cancel order batch",
                "description": "Cancel up to 1024 orders by ID. Each order must belong to the trader associated with the API key.\n\nWe cancel every resting order in the request. The status code summarizes the batch:\n\n- `200`: we sent a cancel for every ID.\n- `207`: we found every ID. Some orders were already filled, cancelled, or rejected. `notCanceled` lists them with that status.\n- `404`: at least one ID does not match an order of yours. `notCanceled` lists it with reason `NOT_FOUND`.\n\nA new order reads as `NOT_FOUND` until its `place` event arrives on your private WebSocket channel. Wait for that event, then cancel again.\n\nThis operation is idempotent. It does not guarantee that the cancel reaches the matching engine before a fill. To confirm a cancel, consume the matching tape and rebuild the order book from it.\n> **Note:** An entry under `canceled` means we sent the cancel. It does **not** mean the order is cancelled.\n\n**Rate limit:** 2048 requests per second.",
                "parameters": [],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "array",
                                "items": {
                                    "type": "string",
                                    "description": "The server-generated UUID of the order to be cancelled",
                                    "example": "123e4567-e89b-12d3-a456-426614174000"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "We sent a cancel for every order.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CancelBatchResponse"
                                }
                            }
                        }
                    },
                    "207": {
                        "description": "We found every ID. Some orders were already terminal. See `notCanceled`.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CancelBatchResponse"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    },
                    "404": {
                        "description": "At least one ID does not match an order of yours. See `notCanceled`.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CancelBatchResponse"
                                }
                            }
                        }
                    }
                },
                "tags": [
                    "Orders"
                ],
                "x-code-samples": [
                    {
                        "lang": "bash",
                        "label": "cURL Example",
                        "source": "curl -X DELETE \"localhost:80/nbx/v2/emm/orders/batch\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '[\n    \"550e8400-e29b-41d4-a716-446655440001\",\n    \"550e8400-e29b-41d4-a716-446655440002\",\n    \"550e8400-e29b-41d4-a716-446655440003\"\n]'"
                    }
                ]
            }
        },
        "/nbx/v2/emm/orders/{orderId}": {
            "delete": {
                "operationId": "cancelSingleOrder",
                "summary": "Cancel order",
                "description": "Cancel a specific order by its unique identifier. The order must belong to the trader associated with the API key. This operation is idempotent, but does not make guarantees about reaching the matching engine before the order is filled.\nTo reliably ensure that an order has been cancelled, consume messages from the matching tape to reconstruct the order book and other stateful structures.\n> **Note:** A successful response indicates that the cancellation request was sent to the queue, but does **not** guarantee that the order will be cancelled.\n\n**Rate limit:** 2048 requests per second.",
                "parameters": [
                    {
                        "name": "orderId",
                        "required": true,
                        "in": "path",
                        "description": "The server-generated UUID of the order to be cancelled",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Order cancelled successfully.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/OrderResponseDto"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Orders"
                ]
            },
            "get": {
                "operationId": "getSingleOrder",
                "summary": "Get order",
                "description": "Fetch details of a specific order using its unique identifier.\n\n**Rate limit:** 256 requests per second.",
                "parameters": [
                    {
                        "name": "orderId",
                        "required": true,
                        "in": "path",
                        "description": "The server-generated UUID of the order to retrieve",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Order retrieved successfully.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/OrderResponseDto"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Orders"
                ]
            }
        },
        "/nbx/v2/emm/kill": {
            "delete": {
                "operationId": "cancelAllOrders",
                "summary": "Cancel all orders",
                "description": "Cancel all active orders for the user, satisfying the provided parameters. This operation is idempotent, but does not make guarantees about reaching the matching engine before the orders are filled.\n\n**Rate limit:** 1 request per 30 seconds.",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Cancellation requests sent to the queue.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/OrderResponseDto"
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Orders"
                ]
            }
        },
        "/nbx/v2/emm/orders/all": {
            "get": {
                "operationId": "getAllOrders",
                "summary": "Get all my orders",
                "description": "Get a list of all orders associated with the user, satisfying the provided parameters. Results are limited to a maximum of 1024 items per request (default 100).\n\n**Rate limit:** 32 requests/second burst, 512 requests/minute sustained.",
                "parameters": [
                    {
                        "name": "currency",
                        "in": "query",
                        "description": "Currency of the order",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "CASH",
                                "COIN"
                            ]
                        }
                    },
                    {
                        "name": "status",
                        "in": "query",
                        "description": "Status of the order",
                        "required": false,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "description": "Number of orders to return (max 1024, default 100)",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "maximum": 1024,
                            "default": 100
                        }
                    },
                    {
                        "name": "offset",
                        "in": "query",
                        "description": "Offset of the orders to return",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "beg",
                        "in": "query",
                        "description": "Beginning timestamp for filtering orders (UTC)",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date-time"
                        }
                    },
                    {
                        "name": "end",
                        "in": "query",
                        "description": "End timestamp for filtering orders (UTC)",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date-time"
                        }
                    },
                    {
                        "name": "marketStatus",
                        "in": "query",
                        "description": "Market status of the order",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "OPEN",
                                "CLOSED",
                                "SETTLED"
                            ]
                        }
                    },
                    {
                        "name": "outcomeStatus",
                        "in": "query",
                        "description": "Outcome status of the order",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "TBD",
                                "WIN",
                                "LOSS",
                                "PUSH"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved all orders for the user",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/OrderResponseDto"
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Orders"
                ]
            }
        },
        "/nbx/v2/emm/fills/all": {
            "get": {
                "operationId": "getAllFills",
                "summary": "Get all my fills",
                "description": "Access a complete list of all fills for the user, satisfying the provided parameters. This operation provides detailed records of each fill, including the quantity, price, and time of execution. Results are limited to a maximum of 256 items per request (default 100).\n\nThis endpoint covers **single contract fills** only. RFQs you quoted and won are a separate surface and do not appear here — list them with `GET /rfq/executions` (see [Execution Feed & Reconciliation](/api-reference/rfq/executions)).\n\n**Rate limit:** 32 requests/second burst, 512 requests/minute sustained.",
                "parameters": [
                    {
                        "name": "currency",
                        "in": "query",
                        "description": "Currency of the fill",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "CASH",
                                "COIN"
                            ]
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "description": "Number of fills to return (max 256, default 100)",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "maximum": 256,
                            "default": 100
                        }
                    },
                    {
                        "name": "offset",
                        "in": "query",
                        "description": "Offset of the fills to return",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "beg",
                        "in": "query",
                        "description": "Beginning timestamp for filtering fills (UTC)",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date-time"
                        }
                    },
                    {
                        "name": "end",
                        "in": "query",
                        "description": "End timestamp for filtering fills (UTC)",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date-time"
                        }
                    },
                    {
                        "name": "marketId",
                        "in": "query",
                        "description": "Only list fills on this market, whatever their dates. It combines with every other filter.",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "uuid"
                        }
                    },
                    {
                        "name": "marketStatus",
                        "in": "query",
                        "description": "Market status of the fill",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "OPEN",
                                "CLOSED",
                                "SETTLED"
                            ]
                        }
                    },
                    {
                        "name": "outcomeStatus",
                        "in": "query",
                        "description": "Outcome status of the fill. FMV matches every FMV-settled outcome, whatever its price.",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "TBD",
                                "WIN",
                                "LOSS",
                                "PUSH",
                                "FMV"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved all fills for the user",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/FillResponseDto"
                                    }
                                },
                                "example": [
                                    {
                                        "id": "01990f91-2d8a-7b6c-8a1e-4f5a6b7c8d90",
                                        "orderId": "01990f88-3a1b-7d2c-8e4f-6a7b8c9d0e11",
                                        "qty": 200,
                                        "price": 0.61,
                                        "isWash": false,
                                        "isTaker": false,
                                        "createdAt": "2026-09-03T18:40:02.917Z",
                                        "marketId": "01990e10-5b2c-7e4d-9f60-1a2b3c4d5e6f",
                                        "outcomeId": "01990e10-5b2c-7e4d-9f60-1a2b3c4d5e71",
                                        "outcomeStatus": "0.731",
                                        "transactions": [
                                            {
                                                "id": "01990f91-2d8a-7b6c-8a1e-4f5a6b7c8d91",
                                                "kind": "FILL_STRAIGHT_MAKER_FUNDS",
                                                "amount": "122",
                                                "createdAt": "2026-09-03T18:40:02.917Z"
                                            }
                                        ]
                                    }
                                ]
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Positions"
                ]
            }
        },
        "/nbx/v2/emm/positions/all": {
            "get": {
                "operationId": "getAllPositions",
                "summary": "Get all my positions",
                "description": "Get a comprehensive overview of all positions held by the user, satisfying the provided parameters. This operation includes details about each position's size, entry price, and current market value. Results are limited to a maximum of 100 items by default.\n\n**Rate limit:** 256 requests per second.",
                "parameters": [
                    {
                        "name": "currency",
                        "in": "query",
                        "description": "The currency denomination",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "CASH",
                                "COIN"
                            ]
                        }
                    },
                    {
                        "name": "outcomeIds",
                        "in": "query",
                        "description": "Comma-separated list of outcome IDs to filter positions by, e.g. `outcomeIds=a,b,c`. If omitted, you will get all positions across open markets. An empty value matches nothing.",
                        "required": false,
                        "style": "form",
                        "explode": false,
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved all positions for the user",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/PositionResponseDto"
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Positions"
                ],
                "x-code-samples": [
                    {
                        "lang": "bash",
                        "label": "cURL Example",
                        "source": "curl -X GET '$API/emm/positions/all' \\\n  -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \\\n  -G \\\n  --data-urlencode 'currency=COIN' \\\n  --data-urlencode 'outcomeIds=6bee554c-d5ee-4ada-b283-112746883542,8d18ea33-2953-469f-a5c9-d407d333529d'"
                    }
                ]
            }
        },
        "/nbx/v2/emm/markets/{marketId}": {
            "get": {
                "operationId": "getSingleMarket",
                "summary": "Get market",
                "description": "Fetch information for a specific market using its unique identifier.\n\n**Rate limit:** 256 requests per second.",
                "parameters": [
                    {
                        "name": "marketId",
                        "required": true,
                        "in": "path",
                        "description": "The server-generated UUID of the market to retrieve",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Market retrieved successfully.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/MarketResponseDto"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Markets"
                ]
            }
        },
        "/nbx/v2/emm/markets/open": {
            "get": {
                "operationId": "getAllOpenMarkets",
                "summary": "Get open markets",
                "description": "Fetch a list of all markets currently open, satisfying the provided parameters.\n\n**Rate limit:** 256 requests per second.",
                "parameters": [
                    {
                        "name": "league",
                        "in": "query",
                        "description": "The league to filter markets by",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "NFL",
                                "NBA",
                                "MLB",
                                "NHL",
                                "NCAAF",
                                "NCAAB",
                                "NCAAWB",
                                "WNBA",
                                "UFC",
                                "MLS",
                                "FIFA Club World Cup",
                                "EPL",
                                "Bundesliga",
                                "Serie A",
                                "La Liga",
                                "Ligue 1",
                                "Champions League",
                                "Europa League",
                                "WTA",
                                "ATP",
                                "PGA",
                                "ENTERTAINMENT"
                            ]
                        }
                    },
                    {
                        "name": "marketType",
                        "in": "query",
                        "description": "The type of market to filter by",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "CUSTOM",
                                "MONEY",
                                "SPREAD",
                                "TOTAL",
                                "1X2",
                                "TEAM_TOTAL",
                                "MONEY_1H",
                                "SPREAD_1H",
                                "TOTAL_1H",
                                "RUSHING_ATTEMPTS",
                                "RUSHING_YARDS",
                                "PASSING_COMPLETIONS",
                                "PASSING_YARDS",
                                "PASSING_ATTEMPTS",
                                "RECEPTIONS",
                                "RECEIVING_YARDS",
                                "LONGEST_RECEPTION",
                                "LONGEST_RUSH",
                                "LONGEST_COMPLETION",
                                "RUSHING_AND_RECEIVING_YARDS",
                                "PITCHER_STRIKEOUTS",
                                "HOME_RUNS",
                                "TOTAL_BASES",
                                "RBIS",
                                "HITS",
                                "HITS_RUNS_RBIS",
                                "PITCHER_OUTS",
                                "RUNS",
                                "WALKS",
                                "EARNED_RUNS",
                                "HITS_ALLOWED",
                                "BATTING_STRIKEOUTS",
                                "STOLEN_BASES",
                                "THREE_POINTERS_MADE",
                                "BLOCKS",
                                "DOUBLE_DOUBLE",
                                "POINTS",
                                "REBOUNDS",
                                "POINTS_REBOUNDS_ASSISTS",
                                "POINTS_ASSISTS",
                                "POINTS_REBOUNDS",
                                "REBOUNDS_ASSISTS",
                                "STEALS",
                                "STEALS_BLOCKS",
                                "TRIPLE_DOUBLE",
                                "FIRST_BASKET",
                                "PLAYER_ACES",
                                "TURNOVERS",
                                "SET_SPREAD",
                                "TOTAL_SETS",
                                "FIRST_SET_MONEYLINE",
                                "FIRST_GOAL_SCORER",
                                "PLAYER_GOALS",
                                "ASSISTS",
                                "ANYTIME_TOUCHDOWN_SCORER",
                                "FIRST_TOUCHDOWN_SCORER",
                                "GO_THE_DISTANCE",
                                "VICTORY_BY_KO_KTO_OR_DQ",
                                "VICTORY_BY_DECISION",
                                "VICTORY_BY_SUBMISSION",
                                "DRAW",
                                "PLAYER_BIRDIES_OR_BETTER",
                                "FIRST_ROUND_MONEYLINE",
                                "SECOND_ROUND_MONEYLINE",
                                "THIRD_ROUND_MONEYLINE",
                                "FOURTH_ROUND_MONEYLINE",
                                "FIRST_INNING_TOTAL",
                                "TO_MAKE_THE_PLAYOFFS",
                                "REGULAR_SEASON_WINS",
                                "SERIES_WINNER",
                                "CHAMPIONSHIP_WINNING_DIVISION",
                                "CHAMPIONSHIP_WINNER",
                                "MVP_WINNER",
                                "EASTERN_CONFERENCE_WINNER",
                                "WESTERN_CONFERENCE_WINNER",
                                "FINALS_MVP",
                                "WINNER",
                                "TOP_FIVE_FINISH",
                                "TOP_TEN_FINISH",
                                "TOP_TWENTY_FINISH",
                                "AL_CENTRAL_DIVISION_WINNER",
                                "NL_CENTRAL_DIVISION_WINNER",
                                "AL_EAST_DIVISION_WINNER",
                                "NL_EAST_DIVISION_WINNER",
                                "AL_WEST_DIVISION_WINNER",
                                "NL_WEST_DIVISION_WINNER",
                                "AL_CY_YOUNG_WINNER",
                                "NL_CY_YOUNG_WINNER",
                                "AL_MVP",
                                "NL_MVP",
                                "AL_ROTY",
                                "NL_ROTY",
                                "AL_WINNER",
                                "NL_WINNER",
                                "WORLD_SERIES_WINNER",
                                "STANLEY_CUP_WINNER",
                                "SUPER_BOWL_WINNER",
                                "NFC_CONFERENCE_WINNER",
                                "AFC_CONFERENCE_WINNER",
                                "NFC_NORTH_WINNER",
                                "NFC_EAST_WINNER",
                                "NFC_SOUTH_WINNER",
                                "NFC_WEST_WINNER",
                                "AFC_NORTH_WINNER",
                                "AFC_EAST_WINNER",
                                "AFC_SOUTH_WINNER",
                                "AFC_WEST_WINNER",
                                "OPOTY",
                                "DPOTY",
                                "OROTY",
                                "DROTY"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved all open markets.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/MarketResponseDto"
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Markets"
                ]
            }
        },
        "/nbx/v2/emm/book/{marketId}": {
            "get": {
                "operationId": "getMarketOrderBook",
                "summary": "Get order book",
                "description": "Get the current order book for a specific market. For both outcomes of the market, orders are returned sorted by price-time priority. Orders on the book are partially obfuscated up to price, quantity, and direction.\n\n**Rate limit:** 256 requests per second.",
                "parameters": [
                    {
                        "name": "marketId",
                        "required": true,
                        "in": "path",
                        "description": "The ID of the market",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "currency",
                        "required": true,
                        "in": "query",
                        "description": "The currency denomination",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "CASH",
                                "COIN"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved the order book.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/BookResponseDto"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Markets"
                ]
            }
        },
        "/nbx/v2/emm/event-metadata/leagues": {
            "get": {
                "operationId": "getLeagues",
                "summary": "Get leagues",
                "description": "Fetch a list of all available leagues.\n\n**Rate limit:** 256 requests per second.",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved leagues.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    },
                                    "example": [
                                        "NFL",
                                        "NBA",
                                        "MLB",
                                        "NHL",
                                        "NCAAF",
                                        "NCAAB",
                                        "MLS",
                                        "EPL",
                                        "UFC",
                                        "PGA"
                                    ]
                                }
                            }
                        }
                    }
                },
                "tags": [
                    "Events"
                ]
            }
        },
        "/nbx/v2/emm/event-metadata/types": {
            "get": {
                "operationId": "getEventTypes",
                "summary": "Get event types",
                "description": "Fetch a list of all available event types.\n\n**Rate limit:** 256 requests per second.",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved event types.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    },
                                    "example": [
                                        "Game",
                                        "Tournament",
                                        "Season"
                                    ]
                                }
                            }
                        }
                    }
                },
                "tags": [
                    "Events"
                ]
            }
        },
        "/nbx/v2/emm/event-metadata/statuses": {
            "get": {
                "operationId": "getEventStatuses",
                "summary": "Get event statuses",
                "description": "Fetch a list of all available event statuses.\n\n**Rate limit:** 256 requests per second.",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved event statuses.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    },
                                    "example": [
                                        "INITIAL",
                                        "OPEN_PREGAME",
                                        "CLOSED_PREGAME",
                                        "OPEN_INGAME",
                                        "FINAL",
                                        "DELAYED",
                                        "CANCELED"
                                    ]
                                }
                            }
                        }
                    }
                },
                "tags": [
                    "Events"
                ]
            }
        },
        "/nbx/v2/emm/events": {
            "get": {
                "operationId": "getEvents",
                "summary": "Get events",
                "description": "Fetch a list of events with optional filters. Results are limited to a maximum of 100 items by default.\n\nFilter on `status=OPEN_INGAME` for the set of live events — the condition under which taker fees are charged. Use this as your liveness snapshot on startup and after a WebSocket reconnect, then track the `EVENT_GOLIVE` / `EVENT_UNLIVE` ticks on the `lifecycle` channel for subsequent transitions.\n\n**Rate limit:** 1024 requests per second.",
                "parameters": [
                    {
                        "name": "league",
                        "in": "query",
                        "description": "Filter by league (e.g., NFL, NBA, MLB)",
                        "required": false,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "type",
                        "in": "query",
                        "description": "Filter by event type (e.g., Game)",
                        "required": false,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "status",
                        "in": "query",
                        "description": "Filter by event status (e.g., OPEN_PREGAME, OPEN_INGAME). `OPEN_INGAME` means the event is live",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "INITIAL",
                                "OPEN_PREGAME",
                                "CLOSED_PREGAME",
                                "OPEN_INGAME",
                                "FINAL",
                                "DELAYED",
                                "CANCELED"
                            ]
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "description": "Number of results to return (max 100, default 100)",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "maximum": 100,
                            "default": 100
                        }
                    },
                    {
                        "name": "offset",
                        "in": "query",
                        "description": "Pagination offset (default 0)",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "default": 0
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved events.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/EventWithMarketsDto"
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Events"
                ],
                "x-code-samples": [
                    {
                        "lang": "bash",
                        "label": "cURL Example",
                        "source": "curl -X GET \"https://api.novig.com/nbx/v2/emm/events?league=NFL&type=Game&status=OPEN_PREGAME&limit=100\" \\\n  -H \"Authorization: Bearer $TOKEN\""
                    }
                ]
            }
        },
        "/nbx/v2/emm/events/{eventId}": {
            "get": {
                "operationId": "getEventById",
                "summary": "Get event",
                "description": "Fetch details of a specific event using its unique identifier.\n\nThe `status` field is the authoritative snapshot of event liveness: `OPEN_INGAME` means the event is live and taker fees apply to fills matched against its markets.\n\n**Rate limit:** 1024 requests per second.",
                "parameters": [
                    {
                        "name": "eventId",
                        "required": true,
                        "in": "path",
                        "description": "The server-generated UUID of the event to retrieve",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Event retrieved successfully.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/EventWithMarketsDto"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    },
                    "404": {
                        "description": "Event not found"
                    }
                },
                "tags": [
                    "Events"
                ],
                "x-code-samples": [
                    {
                        "lang": "bash",
                        "label": "cURL Example",
                        "source": "curl -X GET \"https://api.novig.com/nbx/v2/emm/events/550e8400-e29b-41d4-a716-446655440000\" \\\n  -H \"Authorization: Bearer $TOKEN\""
                    }
                ]
            }
        },
        "/nbx/v2/emm/events/getMarketsByEvents": {
            "post": {
                "operationId": "getMarketsByEvents",
                "summary": "Get markets by events (batch)",
                "description": "Fetch markets for multiple events at once (maximum 50), including current orderbook data. Returns the same data as the single-event endpoint but in a single batched request.\n\n**Rate limit:** 256 requests per second.",
                "parameters": [],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/GetMarketsByEventsRequestDto"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Successfully retrieved markets with orderbooks.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/MarketWithBookDto"
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Markets"
                ]
            }
        },
        "/nbx/v2/emm/events/getMarketsByEvent/{eventId}": {
            "get": {
                "operationId": "getMarketsByEvent",
                "summary": "Get markets by event",
                "description": "Fetch all markets for a specific event, including current orderbook data. This endpoint returns markets with their bid/ask data in a single response, eliminating the need to fetch orders separately.\n\n**Rate limit:** 1024 requests per second.",
                "parameters": [
                    {
                        "name": "eventId",
                        "required": true,
                        "in": "path",
                        "description": "The server-generated UUID of the event",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "currency",
                        "required": true,
                        "in": "query",
                        "description": "Currency for orderbook data",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "CASH",
                                "COIN"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved markets for the event.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/MarketWithBookDto"
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    },
                    "404": {
                        "description": "Event not found"
                    }
                },
                "tags": [
                    "Markets"
                ],
                "x-code-samples": [
                    {
                        "lang": "bash",
                        "label": "cURL Example",
                        "source": "curl -X GET \"https://api.novig.com/nbx/v2/emm/events/getMarketsByEvent/550e8400-e29b-41d4-a716-446655440000?currency=CASH\" \\\n  -H \"Authorization: Bearer $TOKEN\""
                    }
                ]
            }
        },
        "/nbx/v2/emm/account/balance": {
            "get": {
                "operationId": "getWalletBalance",
                "summary": "Get wallet balance",
                "description": "Get the current balance of the user's wallet under the given currency denomination.\n\n**Rate limit:** 256 requests per second.",
                "parameters": [
                    {
                        "name": "currency",
                        "required": true,
                        "in": "query",
                        "description": "The currency denomination",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "CASH",
                                "COIN"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved account balance.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/AccountBalanceDTO"
                                }
                            }
                        }
                    }
                },
                "tags": [
                    "Account"
                ]
            }
        },
        "/nbx/v2/emm/account/open-costs-and-credit": {
            "get": {
                "operationId": "getOpenCostsAndCredit",
                "summary": "Get open costs",
                "description": "Get the user's open position cost for the given currency denomination. `openOrderCost` is always `0`.\n\n> **Note:** Data may be up to 5 seconds behind due to caching.\n\n**Rate limit:** 256 requests per second.",
                "parameters": [
                    {
                        "name": "currency",
                        "required": true,
                        "in": "query",
                        "description": "The currency denomination",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "CASH",
                                "COIN"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved open costs.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/OpenCostsAndCreditDTO"
                                }
                            }
                        }
                    }
                },
                "tags": [
                    "Account"
                ]
            }
        },
        "/nbx/v2/emm/account/dashboard": {
            "get": {
                "operationId": "getDashboardUrl",
                "summary": "Get dashboard URL",
                "description": "Issue a single-use, presigned URL to the EMM analytics dashboard for the authenticated trader.\n\nThe returned URL opens the Novig analytics dashboard (P&L, fills, open exposure, etc.) in a browser. The dashboard is scoped to the authenticated trader — you only ever see your own rows.\n\n- **Single-use:** each URL may be redeemed once. To view refreshed data, call this endpoint again for a new URL.\n- **Redeem immediately:** the URL must be opened within approximately 90 seconds of issuance. Mint a URL at the moment you need it — do not request URLs ahead of time, cache them, or hand them to a background job.\n- **`expiresAt`:** see the field note in the response schema. It does not currently describe the redemption window, so do not use it to schedule refreshes.\n\n**Rate limit:** 64 requests per second.",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Dashboard URL issued.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/DashboardUrlResponseDto"
                                }
                            }
                        }
                    }
                },
                "tags": [
                    "Account"
                ],
                "x-code-samples": [
                    {
                        "lang": "bash",
                        "label": "cURL Example",
                        "source": "curl -X GET \"$API/emm/account/dashboard\" \\\n  -H \"Authorization: Bearer $TOKEN\""
                    }
                ]
            }
        },
        "/nbx/v2/emm/locks": {
            "get": {
                "operationId": "getLockStatus",
                "summary": "Get lock status",
                "description": "Report every live trading lock: the current system lock, and the IDs of every locked event.\n\nA lock counts as live when it has not been cleared and has not expired. `systemLock` reports `null` when the exchange is open. An event with several live locks still appears once in `lockedEventIds`.\n\n**Rate limit:** 256 requests per second.",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Lock status reported.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/LockStatusResponseDto"
                                }
                            }
                        }
                    }
                },
                "tags": [
                    "Markets"
                ],
                "x-code-samples": [
                    {
                        "lang": "bash",
                        "label": "cURL Example",
                        "source": "curl -X GET \"$API/emm/locks\" \\\n  -H \"Authorization: Bearer $TOKEN\""
                    }
                ]
            }
        },
        "/nbx/v2/emm/transactions": {
            "get": {
                "operationId": "getUserTransactions",
                "summary": "Get user transactions",
                "description": "Get a detailed history of all transactions made by the user, satisfying the provided parameters. Results are limited to a maximum of 256 items per request (default 100).\n\n**Rate limit:** 32 requests/second burst, 512 requests/minute sustained.",
                "parameters": [
                    {
                        "name": "currency",
                        "in": "query",
                        "description": "Currency of the transaction",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "CASH",
                                "COIN"
                            ]
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "description": "Number of transactions to return (max 256, default 100)",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "maximum": 256,
                            "default": 100
                        }
                    },
                    {
                        "name": "offset",
                        "in": "query",
                        "description": "Offset of the transactions to return",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "beg",
                        "in": "query",
                        "description": "Beginning timestamp for filtering transactions (UTC)",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date-time"
                        }
                    },
                    {
                        "name": "end",
                        "in": "query",
                        "description": "End timestamp for filtering transactions (UTC)",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date-time"
                        }
                    },
                    {
                        "name": "type",
                        "in": "query",
                        "description": "Type of the transaction",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "REALIZED_PNL",
                                "ORDER_PLACED",
                                "ORDER_CANCEL",
                                "ORDER_REJECT",
                                "SETTLEMENT",
                                "RESETTLEMENT",
                                "PRICE_IMPROVEMENT",
                                "PUSH",
                                "VOID",
                                "WASH",
                                "ADJUSTMENT"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved user transactions.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/TransactionResponseDto"
                                    }
                                }
                            }
                        }
                    }
                },
                "tags": [
                    "Account"
                ]
            }
        },
        "/tape/lifecycle": {
            "get": {
                "x-hidden": true,
                "tags": [
                    "WebSockets"
                ],
                "summary": "Market Lifecycle Channel",
                "description": "Subscribe to market lifecycle events (OPEN, END, CLOSE, START). This is a global channel that provides updates for all markets.\n\nWhen a market closes (indicated by a `CLOSE` event from this channel), all outstanding orders on that market are implicitly cancelled. No individual cancellation messages will be sent for these orders. Traders must use market lifecycle events to manage order state for any open orders in the given market.\n\n```javascript\n// Subscribe\nws.send(JSON.stringify({ \n  event: 'subscribe',\n  data: 'lifecycle' \n}));\n\n// Example Event (bare payload - no {event, data} envelope)\n{ \n  type: 'OPEN', \n  market: MarketResponseDto \n}\n```",
                "responses": {
                    "200": {
                        "description": "Lifecycle event received",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/LifecycleEvent"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/tape/book": {
            "get": {
                "x-hidden": true,
                "tags": [
                    "WebSockets"
                ],
                "summary": "Order Book Channel",
                "description": "Subscribe to public order book updates (PLACE, CANCEL). You can subscribe to either the global tape channel for all market updates or to a specific market ID to receive updates only for that market.\n\nThis channel only broadcasts explicit cancellations that affect the public order book. Implicit cancellations, such as those that occur when a market closes, are **not** broadcast here. For those, you must use the Market Lifecycle Channel.\n\n```javascript\n// Subscribe to global tape (all markets)\nws.send(JSON.stringify({ \n  event: 'subscribe',\n  data: 'tape' \n}));\n\n// Subscribe to a specific market\nws.send(JSON.stringify({ \n  event: 'subscribe',\n  data: '123e4567-e89b-12d3-a456-426614174000' \n}));\n\n// Example Event (bare payload - no {event, data} envelope)\n{ \n  type: 'PLACE', \n  order: ObfuscatedOrderDto,\n  fills: ObfuscatedFillDto[],\n  market: MarketResponseDto \n}\n```\n\nWhen subscribing to a specific market, the ack is followed by one enveloped `{ event: 'book', data: { book: ... } }` snapshot of the current order book state.",
                "responses": {
                    "200": {
                        "description": "Book event received",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/BookEvent"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/tape/private": {
            "get": {
                "x-hidden": true,
                "tags": [
                    "WebSockets"
                ],
                "summary": "Private Updates Channel",
                "description": "Receive private placement, fill, and explicit cancellation updates for your orders.\n\n**Explicit Cancellations** are sent when:\n- You cancel an order via an API request.\n- A Good-Til-Time (GTT) order expires.\n\n**Implicit Cancellations** (e.g., when a market closes) do **not** send individual cancellation messages here. To handle implicit cancellations, you must subscribe to the Market Lifecycle Channel.\n\n```javascript\n// Place Event\n{ \n  event: 'place',\n  data: OrderResponseDto \n}\n\n// Fill Event\n{ \n  event: 'fill',\n  data: FillResponseDto \n}\n\n// Cancel Event\n{ \n  event: 'cancel',\n  data: OrderResponseDto \n}\n```",
                "responses": {
                    "200": {
                        "description": "Private update received",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "oneOf": [
                                        {
                                            "$ref": "#/components/schemas/FillResponseDto"
                                        },
                                        {
                                            "$ref": "#/components/schemas/OrderResponseDto"
                                        }
                                    ]
                                }
                            }
                        }
                    }
                }
            }
        },
        "/nbx/v2/emm/orders/event/{eventId}": {
            "delete": {
                "x-hidden": true,
                "operationId": "cancelOrderByEventId",
                "summary": "Cancel order by event ID",
                "description": "Cancel all orders associated with an event ID. The orders must belong to the trader associated with the API key. Note that a 200 does not necessarily mean the orders are successfully cancelled, only that the request was received.\n\n**Rate limit:** 2048 requests per second.",
                "parameters": [
                    {
                        "name": "eventId",
                        "required": true,
                        "in": "path",
                        "description": "The server-generated UUID of the event",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Order cancellation request sent to the queue.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/OrderResponseDto"
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Orders"
                ]
            }
        },
        "/nbx/v2/emm/orders/market/{marketId}": {
            "delete": {
                "x-hidden": true,
                "operationId": "cancelOrderByMarketId",
                "summary": "Cancel order by market ID",
                "description": "Cancel all orders associated with a market ID. The orders must belong to the trader associated with the API key. Note that a 200 does not necessarily mean the orders are successfully cancelled, only that the request was received.\n\n**Rate limit:** 2048 requests per second.",
                "parameters": [
                    {
                        "name": "marketId",
                        "required": true,
                        "in": "path",
                        "description": "The server-generated UUID of the market",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Order cancellation request sent to the queue.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/OrderResponseDto"
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Orders"
                ]
            }
        },
        "/nbx/v2/emm/orders/outcome/{outcomeId}": {
            "delete": {
                "x-hidden": true,
                "operationId": "cancelOrderByOutcomeId",
                "summary": "Cancel order by outcome ID",
                "description": "Cancel all orders associated with an outcome ID. The orders must belong to the trader associated with the API key. Note that a 200 does not necessarily mean the orders are successfully cancelled, only that the request was received.\n\n**Rate limit:** 2048 requests per second.",
                "parameters": [
                    {
                        "name": "outcomeId",
                        "required": true,
                        "in": "path",
                        "description": "The server-generated UUID of the outcome",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Order cancellation request sent to the queue.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/OrderResponseDto"
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request"
                    }
                },
                "tags": [
                    "Orders"
                ]
            }
        },
        "/nbx/v2/emm/strike-requests": {
            "post": {
                "operationId": "requestStrike",
                "summary": "Request new market strike",
                "description": "Request a new strike for an existing market. This sends a notification to the Novig team, who may then choose to create the market. A successful response does **not** guarantee that the market will be created.\n\nThe strike value accepts whole numbers or half-points (values ending in `.5`). Whole numbers are automatically converted to `.5` strikes (e.g. `300` becomes `300.5`).\n\nThe request will be rejected if a market with the same event, type, player, and strike already exists.\n\n**Rate limit:** 64 requests per second.",
                "parameters": [],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/StrikeRequestDto"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Strike request submitted",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/StrikeRequestResponseDto"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad request — market not found, invalid strike value, or strike already exists for this market type"
                    }
                },
                "tags": [
                    "Markets"
                ],
                "x-code-samples": [
                    {
                        "lang": "bash",
                        "label": "cURL Example",
                        "source": "curl -X POST \"$API/emm/strike-requests\" \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"marketId\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"strike\": 300.5\n}'"
                    }
                ]
            }
        },
        "/nbx/v2/emm/ticks": {
            "get": {
                "operationId": "getTicks",
                "summary": "Get ticks",
                "description": "Fetch the canonical set of valid submittable price ticks. Orders must be priced at one of these ticks; prices outside the table will be rejected.\n\nDo not hardcode this table. Always fetch it dynamically, as it may change in the future.\n\n> **Note:** The example response is truncated for readability — `…` denotes omitted ticks between the listed values. Always use the live response for the full set of valid ticks.\n\n**Rate limit:** 256 requests per second.",
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "Successfully retrieved the tick table.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "type": "number"
                                    },
                                    "example": [
                                        0.001,
                                        0.002,
                                        0.003,
                                        0.004,
                                        0.005,
                                        "…",
                                        0.01,
                                        "…",
                                        0.05,
                                        0.055,
                                        "…",
                                        0.1,
                                        "…",
                                        0.5,
                                        "…",
                                        0.9,
                                        "…",
                                        0.945,
                                        0.95,
                                        "…",
                                        0.995,
                                        0.996,
                                        0.997,
                                        0.998,
                                        0.999
                                    ]
                                }
                            }
                        }
                    }
                },
                "tags": [
                    "Markets"
                ],
                "x-code-samples": [
                    {
                        "lang": "bash",
                        "label": "cURL Example",
                        "source": "curl -X GET \"$API/emm/ticks\" \\\n  -H \"Authorization: Bearer $TOKEN\""
                    }
                ]
            }
        }
    },
    "info": {
        "title": "NBX API",
        "description": "## API Overview\n\nThe NBX API is designed with two interfaces:\n\n- **REST API**\n  - **URL:**          `https://api.novig.com/nbx/v2`\n  - **Constraints:**\n    - **Rate limits:**\n      - Single-order placement: 2048 requests per second\n      - Batch placement: 64 requests per second\n      - Order cancellation: 2048 requests per second\n      - Kill switch: 1 request per 30 seconds\n      - Data retrieval: 256 requests per second\n      - User history (`/fills`, `/orders`, `/transactions`): 32 requests/second burst, 512 requests/minute sustained\n    - **Timeout:**    5 seconds\n  - **Features:**\n    - Place, cancel, and query orders.\n    - Retrieve market data and positions.\n    - Manage account settings and balances.\n  - **Best Practices:**\n    - Use appropriate HTTP methods.\n    - Include `Authorization` and `Content-Type` headers.\n    - Implement exponential backoff for handling rate limits and robust error handling.\n\n- **WebSocket API**\n  - **URL:**          `wss://api.novig.com/tape`\n  - **Constraints:**\n    - **Keepalive:** protocol-level WebSocket Ping every 15 seconds; standard clients respond automatically, and a client that misses a full interval is disconnected\n  - **Features:**\n    - Real-time order book ticks.\n    - Real-time market lifecycle updates.\n    - Private place, fill, and cancel notifications.\n    - Protocol-level heartbeat to ensure connection health.\n  - **Best Practices:**\n    - Implement reconnection logic with exponential backoff.\n    - Process messages sequentially to maintain order book integrity.\n    - Appropriately handle various event types.\n    - Subscribe to specific market events or to the global tape.\n\n## Authentication\n\nThe NBX API uses [**OAuth 2.0 Client Credentials**](https://auth0.com/docs/get-started/authentication-and-authorization-flow/client-credentials-flow) with JSON Web Tokens (JWT).\n\n1. **Obtain Credentials:** Request your client ID and secret from Novig.\n2. **Request an Access Token:** Send a POST request to the OAuth endpoint. For example:\n```bash\ncurl \n  --request POST \n  --url https://auth.novig.us/oauth/token \n  --header \"Content-Type: application/json\" \n  --data '{ \n    \"audience\"      : \"https://api.novig.us\", \n    \"grant_type\"    : \"client_credentials\", \n    \"client_id\"     : \"YOUR_CLIENT_ID\", \n    \"client_secret\" : \"YOUR_CLIENT_SECRET\" \n  }'\n```\n3. **Use the Token:** Include the token in your requests by setting the HTTP header:\n```bash\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n\n> **Note:** For integration in the QA environment, you'll need to use different endpoints:\n> - **Issuer:** `https://auth-qa.novig.us`\n> - **Audience:** `https://api-qa.novig.us`\n> - **API Base URL:** `https://api-qa.novig.us`\n\n",
        "version": "0.0.44",
        "contact": {
            "name": "Contact",
            "url": "https://novig.com",
            "email": "tech@novig.com"
        }
    },
    "tags": [
        {
            "name": "Orders",
            "description": "Endpoints for managing orders and trades"
        },
        {
            "name": "Markets",
            "description": "Endpoints for accessing market data and order books"
        },
        {
            "name": "Events",
            "description": "Endpoints for discovering events and fetching event-related data"
        },
        {
            "name": "Account",
            "description": "Endpoints for managing account settings and balances"
        },
        {
            "name": "Positions",
            "description": "Endpoints for accessing positions and fills"
        },
        {
            "name": "WebSockets",
            "description": "Channels for real-time market data and order updates"
        }
    ],
    "components": {
        "securitySchemes": {
            "bearer": {
                "scheme": "bearer",
                "bearerFormat": "JWT",
                "type": "http"
            }
        },
        "schemas": {
            "OrderRequestDto": {
                "type": "object",
                "properties": {
                    "outcomeId": {
                        "type": "string",
                        "description": "The server-generated UUID of the outcome for which the order will increase exposure",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "price": {
                        "type": "number",
                        "description": "The price of the order in decimal probability, up to 3 decimal places",
                        "example": 0.667
                    },
                    "qty": {
                        "type": "number",
                        "description": "The number of minimal currency units for the order. Note that this must be a positive integer. For CASH orders, 1 unit = 0.01 Novig Cash (e.g., 100 units = 1.00 Cash). For COIN orders, 1 unit = 1 Novig Coin",
                        "example": 110
                    },
                    "currency": {
                        "type": "string",
                        "description": "Denomination of the order, i.e. `CASH` or `COIN`",
                        "example": "CASH"
                    },
                    "tif": {
                        "type": "string",
                        "description": "`GTC`, `GTT`, `IOC`, `FOK`, or `PO` (default is `GTC`). `PO` (post only) rejects the order instead of matching it immediately as a taker, so it only ever rests as a maker order.",
                        "example": "GTC"
                    },
                    "ttl": {
                        "type": "number",
                        "description": "Time to live for the order (milliseconds) after which the order will be automatically canceled if not totally filled. Required under `GTT` time-in-force; optional under `PO`, where it self-expires if provided and otherwise rests until canceled",
                        "example": 2400
                    },
                    "flags": {
                        "type": "string",
                        "description": "Custom 8-character string field for storing trader-specified flags or metadata about the order",
                        "example": "ABC12345",
                        "maxLength": 8
                    }
                },
                "required": [
                    "outcomeId",
                    "price",
                    "qty",
                    "currency",
                    "tif"
                ]
            },
            "OrderResponseDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The unique identifier of the order",
                        "example": "123e4567-e89b-12d3-a456-426614174002"
                    },
                    "outcomeId": {
                        "type": "string",
                        "description": "The ID of the outcome associated with this order",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "marketId": {
                        "type": "string",
                        "description": "The ID of the market associated with this order",
                        "example": "123e4567-e89b-12d3-a456-426614174003"
                    },
                    "price": {
                        "type": "number",
                        "description": "The limit price at which the order is placed",
                        "example": 0.125
                    },
                    "qty": {
                        "type": "number",
                        "description": "The remaining quantity of the order, denominated in Minimum Currency Units",
                        "example": 4200
                    },
                    "originalQty": {
                        "type": "number",
                        "description": "The original quantity of the order, denominated in Minimum Currency Units",
                        "example": 4200
                    },
                    "currency": {
                        "type": "string",
                        "description": "The currency in which the order is denominated",
                        "example": "COIN"
                    },
                    "timestamp": {
                        "type": "string",
                        "description": "The timestamp when the order was placed",
                        "example": "2023-10-05T12:00:00Z"
                    },
                    "status": {
                        "type": "string",
                        "description": "The current status of the order",
                        "example": "FILLED"
                    },
                    "flags": {
                        "type": "string",
                        "description": "The trader-specified metadata associated with the order",
                        "example": "ABC12345"
                    }
                }
            },
            "OrderFilterDTO": {
                "type": "object",
                "properties": {
                    "beg": {
                        "type": "string",
                        "format": "date-time",
                        "description": "Beginning timestamp for filtering orders (UTC)",
                        "example": "2023-10-05T12:00:00Z"
                    },
                    "end": {
                        "type": "string",
                        "format": "date-time",
                        "description": "End timestamp for filtering orders (UTC)",
                        "example": "2023-10-05T13:00:00Z"
                    },
                    "status": {
                        "type": "string",
                        "description": "Status of the order",
                        "example": "FILLED"
                    },
                    "currency": {
                        "type": "string",
                        "description": "Currency of the order",
                        "example": "COIN"
                    },
                    "limit": {
                        "type": "integer",
                        "description": "Number of orders to return",
                        "example": 100
                    },
                    "offset": {
                        "type": "integer",
                        "description": "Offset of the orders to return",
                        "example": 0
                    },
                    "marketStatus": {
                        "type": "string",
                        "description": "Market status of the order",
                        "example": "OPEN"
                    },
                    "outcomeStatus": {
                        "type": "string",
                        "description": "Outcome status of the order",
                        "example": "TBD"
                    }
                }
            },
            "FillFilterDTO": {
                "type": "object",
                "properties": {
                    "beg": {
                        "type": "string",
                        "format": "date-time",
                        "description": "Beginning timestamp for filtering fills (UTC)",
                        "example": "2023-10-05T12:00:00Z"
                    },
                    "end": {
                        "type": "string",
                        "format": "date-time",
                        "description": "End timestamp for filtering fills (UTC)",
                        "example": "2023-10-05T13:00:00Z"
                    },
                    "currency": {
                        "type": "string",
                        "description": "Currency of the fill",
                        "example": "COIN"
                    },
                    "limit": {
                        "type": "integer",
                        "description": "Number of fills to return",
                        "example": 100
                    },
                    "offset": {
                        "type": "integer",
                        "description": "Offset of the fills to return",
                        "example": 0
                    },
                    "marketStatus": {
                        "type": "string",
                        "description": "Market status of the fill",
                        "example": "OPEN"
                    },
                    "outcomeStatus": {
                        "type": "string",
                        "description": "Outcome status of the fill. FMV matches every FMV-settled outcome, whatever its price.",
                        "example": "TBD"
                    }
                }
            },
            "FillResponseDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The ID of the fill",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "orderId": {
                        "type": "string",
                        "description": "The ID of the order that was filled",
                        "example": "123e4567-e89b-12d3-a456-426614174001"
                    },
                    "price": {
                        "type": "number",
                        "description": "Price at which the fill executed, as a decimal probability",
                        "example": 0.225
                    },
                    "qty": {
                        "type": "number",
                        "description": "Quantity filled, in minimum currency units (100 qty = 1.00 CASH)",
                        "example": 75
                    },
                    "createdAt": {
                        "type": "string",
                        "format": "date-time",
                        "description": "The timestamp when the fill occurred",
                        "example": "2023-10-05T12:00:00Z"
                    },
                    "isWash": {
                        "type": "boolean",
                        "description": "Whether the fill is a wash trade",
                        "example": false
                    },
                    "isTaker": {
                        "type": "boolean",
                        "description": "Whether your filled order was the taker (true) or the maker (false)",
                        "example": true
                    },
                    "marketId": {
                        "type": "string",
                        "description": "The ID of the related market",
                        "example": "123e4567-e89b-12d3-a456-426614174002"
                    },
                    "outcomeId": {
                        "type": "string",
                        "description": "The ID of the related outcome",
                        "example": "123e4567-e89b-12d3-a456-426614174003"
                    },
                    "outcomeStatus": {
                        "type": "string",
                        "description": "Grading status of the outcome the fill occurred on: `TBD`, `WIN`, `LOSS`, `PUSH`, or a decimal string like `0.731` for an outcome settled at fair market value (FMV). Reports the status at the time you read it, not at the time of the fill. Omitted on real-time `fill` events over the WebSocket private channel.",
                        "example": "0.731"
                    },
                    "fee": {
                        "type": "string",
                        "description": "Total fee charged to you on this fill, as a decimal string in minimum currency units. Omitted when no fee was charged (maker fills, and fills matched while the event was not live), and on real-time `fill` events.",
                        "example": "1.4274"
                    },
                    "transactions": {
                        "type": "array",
                        "description": "Ledger transactions between your wallet and this fill: the `FILL_*` collateral charge, the `FEE_*` fee when one was charged, and the `MAKER_CREDIT_STRAIGHT` maker credit when the fill earned one. Only your own wallet's transactions are listed — a maker never sees the taker's fee here. Omitted on real-time `fill` events; fetch the fill history to see them.",
                        "items": {
                            "$ref": "#/components/schemas/FillTransactionResponseDto"
                        }
                    }
                },
                "required": [
                    "id",
                    "orderId",
                    "price",
                    "qty",
                    "createdAt",
                    "isWash",
                    "isTaker",
                    "marketId",
                    "outcomeId"
                ]
            },
            "FillTransactionKind": {
                "type": "string",
                "description": "Which money movement a fill's ledger transaction is. `FILL_*` is the collateral funding the fill; `FEE_*` is the fee charged on it; `MAKER_CREDIT_STRAIGHT` is the maker credit paid to you for it. The remaining segments of `FILL_*` and `FEE_*` name the product (`STRAIGHT`), your role on the fill (`TAKER` or `MAKER`), for fees whether the event was live at match time (`LIVE` or `NONLIVE`), and the funding source (`FUNDS` for cash balance, `TRADE_CREDIT` for promotional credit). Under the current fee schedule only `FEE_STRAIGHT_TAKER_LIVE_*` fees are charged; the other `FEE_*` values are reserved.",
                "enum": [
                    "FILL_STRAIGHT_TAKER_FUNDS",
                    "FILL_STRAIGHT_TAKER_TRADE_CREDIT",
                    "FILL_STRAIGHT_MAKER_FUNDS",
                    "FILL_STRAIGHT_MAKER_TRADE_CREDIT",
                    "FEE_STRAIGHT_MAKER_LIVE_FUNDS",
                    "FEE_STRAIGHT_MAKER_NONLIVE_FUNDS",
                    "FEE_STRAIGHT_TAKER_LIVE_FUNDS",
                    "FEE_STRAIGHT_TAKER_NONLIVE_FUNDS",
                    "FEE_STRAIGHT_MAKER_LIVE_TRADE_CREDIT",
                    "FEE_STRAIGHT_MAKER_NONLIVE_TRADE_CREDIT",
                    "FEE_STRAIGHT_TAKER_LIVE_TRADE_CREDIT",
                    "FEE_STRAIGHT_TAKER_NONLIVE_TRADE_CREDIT",
                    "MAKER_CREDIT_STRAIGHT"
                ],
                "example": "FILL_STRAIGHT_MAKER_FUNDS"
            },
            "FillTransactionResponseDto": {
                "type": "object",
                "description": "One ledger transaction between your wallet and a fill.",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The ID of the transaction",
                        "example": "01990f91-2d8a-7b6c-8a1e-4f5a6b7c8d91"
                    },
                    "kind": {
                        "$ref": "#/components/schemas/FillTransactionKind"
                    },
                    "amount": {
                        "type": "string",
                        "description": "Amount of the transaction, as a positive decimal string in minimum currency units. `FILL_*` and `FEE_*` transactions debit your wallet by this amount; `MAKER_CREDIT_STRAIGHT` credits it. For a `FILL_*` charge this is your collateral, `price × qty` for the outcome you bought.",
                        "example": "122"
                    },
                    "createdAt": {
                        "type": "string",
                        "format": "date-time",
                        "description": "The timestamp when the transaction was created",
                        "example": "2026-09-03T18:40:02.917Z"
                    }
                },
                "required": [
                    "id",
                    "kind",
                    "amount",
                    "createdAt"
                ]
            },
            "WalletRequestDto": {
                "type": "object",
                "properties": {
                    "outcomeIds": {
                        "description": "Array of outcome IDs to filter positions by. If omitted, you will get all positions across open markets.",
                        "type": "array",
                        "items": {
                            "type": "string",
                            "example": "123e4567-e89b-12d3-a456-426614174000"
                        }
                    }
                }
            },
            "PositionResponseDto": {
                "type": "object",
                "properties": {
                    "marketId": {
                        "type": "string",
                        "description": "The ID of the market this position is for",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "outcomeId": {
                        "type": "string",
                        "description": "The ID of the outcome this position is for",
                        "example": "123e4567-e89b-12d3-a456-426614174001"
                    },
                    "size": {
                        "type": "number",
                        "description": "The quantity of positive exposure to the outcome",
                        "example": 100
                    },
                    "cost": {
                        "type": "number",
                        "description": "The net entry cost of the position",
                        "example": 66.67
                    },
                    "currency": {
                        "type": "string",
                        "description": "The currency of the position",
                        "example": "COIN"
                    }
                }
            },
            "MarketResponseDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The ID of the market",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "description": {
                        "type": "string",
                        "description": "Description of the market",
                        "example": "KC v BUF Total"
                    },
                    "status": {
                        "type": "string",
                        "description": "The current status of the market (OPEN, CLOSED, or SETTLED)",
                        "example": "OPEN"
                    },
                    "strike": {
                        "type": "number",
                        "description": "The threshold of the market in the unit of the stat type",
                        "nullable": true,
                        "example": 26.5
                    },
                    "type": {
                        "type": "string",
                        "description": "The type of market (MONEY, SPREAD, TOTAL, RUSHING_ATTEMPTS, etc.)",
                        "example": "TOTAL"
                    },
                    "league": {
                        "type": "string",
                        "description": "The league of the market",
                        "example": "NFL"
                    },
                    "volume": {
                        "type": "number",
                        "description": "The total volume of the market in CASH denomination",
                        "example": 1000000
                    },
                    "eventId": {
                        "type": "string",
                        "description": "The event associated with the market",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "event": {
                        "$ref": "#/components/schemas/EventResponseDto",
                        "description": "The event details associated with the market"
                    },
                    "outcomeIds": {
                        "description": "Array of outcome IDs linked to this market",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "123e4567-e89b-12d3-a456-426614174002",
                            "123e4567-e89b-12d3-a456-426614174003"
                        ]
                    },
                    "outcomes": {
                        "description": "Array of outcomes linked to this market",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/OutcomeResponseDto"
                        }
                    },
                    "playerId": {
                        "type": "string",
                        "description": "The player associated with the market (if applicable)",
                        "nullable": true,
                        "example": "123e4567-e89b-12d3-a456-426614174001"
                    },
                    "player": {
                        "$ref": "#/components/schemas/PlayerResponseDto",
                        "description": "The player associated with the market (if applicable)",
                        "nullable": true
                    },
                    "competitor": {
                        "$ref": "#/components/schemas/TeamResponseDto",
                        "description": "The competitor associated with the market (if applicable)",
                        "nullable": true
                    },
                    "settledAt": {
                        "type": "string",
                        "description": "When the market was settled (if applicable)",
                        "nullable": true,
                        "example": "2023-10-05T12:00:00Z"
                    }
                },
                "required": [
                    "id",
                    "description",
                    "status",
                    "type",
                    "league",
                    "volume",
                    "eventId",
                    "outcomeIds",
                    "outcomes"
                ]
            },
            "ObfuscatedOrderDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The ID of the order",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "price": {
                        "type": "number",
                        "description": "The price of the order (in decimal probability, up to 3 decimal places)",
                        "example": 0.667
                    },
                    "qty": {
                        "type": "number",
                        "description": "The remaining quantity of the order, denominated in Minimum Currency Units",
                        "example": 110
                    },
                    "originalQty": {
                        "type": "number",
                        "description": "The original quantity of the order, denominated in Minimum Currency Units",
                        "example": 110
                    },
                    "currency": {
                        "type": "string",
                        "enum": [
                            "CASH",
                            "COIN"
                        ],
                        "description": "The currency in which the order is denominated",
                        "example": "CASH"
                    },
                    "outcomeId": {
                        "type": "string",
                        "description": "The ID of the outcome for which the order is placed"
                    },
                    "marketId": {
                        "type": "string",
                        "description": "The ID of the market for which the order is placed"
                    },
                    "status": {
                        "type": "string",
                        "description": "The status of the order immediately after execution",
                        "example": "RESTING"
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time",
                        "description": "The timestamp when the order was created",
                        "example": "2024-01-01T00:00:00.000Z"
                    }
                },
                "required": [
                    "id",
                    "price",
                    "qty",
                    "originalQty",
                    "currency",
                    "outcomeId",
                    "marketId",
                    "status",
                    "created_at"
                ]
            },
            "BookLadderDto": {
                "type": "object",
                "properties": {
                    "outcomeId": {
                        "type": "string",
                        "description": "The ID of the outcome"
                    },
                    "bids": {
                        "description": "List of bid orders in price-time priority order",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ObfuscatedOrderDto"
                        }
                    }
                },
                "required": [
                    "outcomeId",
                    "bids"
                ]
            },
            "BookResponseDto": {
                "type": "object",
                "properties": {
                    "marketId": {
                        "type": "string",
                        "description": "The ID of the market"
                    },
                    "marketDescription": {
                        "type": "string",
                        "description": "Description of the market"
                    },
                    "outcomeLadders": {
                        "description": "List of outcomes with their order books",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/BookLadderDto"
                        }
                    }
                },
                "required": [
                    "marketId",
                    "marketDescription",
                    "outcomeLadders"
                ]
            },
            "TxFilterDTO": {
                "type": "object",
                "properties": {
                    "beg": {
                        "type": "string",
                        "format": "date-time",
                        "description": "Beginning timestamp for filtering transactions (UTC)",
                        "example": "2023-10-05T12:00:00Z"
                    },
                    "end": {
                        "type": "string",
                        "format": "date-time",
                        "description": "End timestamp for filtering transactions (UTC)",
                        "example": "2023-10-05T13:00:00Z"
                    },
                    "currency": {
                        "type": "string",
                        "description": "Currency of the transaction",
                        "example": "COIN"
                    },
                    "limit": {
                        "type": "integer",
                        "description": "Number of transactions to return",
                        "example": 100
                    },
                    "offset": {
                        "type": "integer",
                        "description": "Offset of the transactions to return",
                        "example": 0
                    },
                    "type": {
                        "type": "string",
                        "description": "Type of the transaction",
                        "example": "DEPOSIT"
                    }
                }
            },
            "AccountBalanceDTO": {
                "type": "object",
                "properties": {
                    "balance": {
                        "type": "number",
                        "description": "The balance amount available in the wallet.",
                        "example": 1738.42
                    }
                },
                "required": [
                    "balance"
                ]
            },
            "OpenCostsAndCreditDTO": {
                "type": "object",
                "properties": {
                    "openPositionCost": {
                        "type": "number",
                        "description": "The cost locked in open positions.",
                        "example": 250
                    },
                    "openOrderCost": {
                        "type": "number",
                        "description": "Always `0`.",
                        "example": 0
                    },
                    "currency": {
                        "type": "string",
                        "description": "The currency denomination of the associated wallet.",
                        "enum": [
                            "CASH",
                            "COIN"
                        ],
                        "example": "CASH"
                    }
                },
                "required": [
                    "openPositionCost",
                    "openOrderCost",
                    "currency"
                ]
            },
            "DashboardUrlResponseDto": {
                "type": "object",
                "properties": {
                    "url": {
                        "type": "string",
                        "format": "uri",
                        "description": "Presigned, single-use URL to the EMM analytics dashboard. Open it in a browser immediately after issuance; request a new URL to view refreshed data.",
                        "example": "https://app.hex.tech/embed/<project-id>/?presigned_url_token=eyJhbGciOi..."
                    },
                    "expiresAt": {
                        "type": "string",
                        "format": "date-time",
                        "description": "ISO-8601 timestamp returned alongside the URL.\n\n> **Note:** this value currently reports 24 hours after issuance, which does not match the URL's actual redemption window of approximately 90 seconds. Do not use `expiresAt` to schedule refreshes — mint a new URL immediately before each use.",
                        "example": "2026-05-22T15:04:05.000Z"
                    }
                },
                "required": [
                    "url",
                    "expiresAt"
                ]
            },
            "ActiveLockDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "format": "uuid",
                        "description": "The lock's ID.",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "minuteDuration": {
                        "type": "integer",
                        "nullable": true,
                        "description": "How long the lock lasts, in minutes, from `createdAt`. `null` means indefinite — the lock stays live until it's cleared.",
                        "example": 60
                    },
                    "createdAt": {
                        "type": "string",
                        "format": "date-time",
                        "description": "When the lock was placed.",
                        "example": "2026-08-27T14:54:24.000Z"
                    },
                    "reason": {
                        "type": "string",
                        "nullable": true,
                        "description": "Why the lock was placed.",
                        "example": "incident"
                    }
                },
                "required": [
                    "id",
                    "minuteDuration",
                    "createdAt",
                    "reason"
                ]
            },
            "LockStatusResponseDto": {
                "type": "object",
                "properties": {
                    "systemLock": {
                        "$ref": "#/components/schemas/ActiveLockDto",
                        "description": "The current exchange-wide lock.",
                        "nullable": true
                    },
                    "lockedEventIds": {
                        "type": "array",
                        "description": "IDs of every event with a live lock. An event with several live locks appears once.",
                        "items": {
                            "type": "string",
                            "format": "uuid"
                        }
                    }
                },
                "required": [
                    "systemLock",
                    "lockedEventIds"
                ]
            },
            "TransactionResponseDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The unique identifier of the transaction",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "amount": {
                        "type": "number",
                        "description": "The amount of the transaction",
                        "example": 1738.42
                    },
                    "type": {
                        "type": "string",
                        "description": "The type of transaction",
                        "example": "DEPOSIT"
                    },
                    "currency": {
                        "type": "string",
                        "description": "The currency of the transaction",
                        "example": "COIN"
                    },
                    "createdAt": {
                        "type": "string",
                        "format": "date-time",
                        "description": "The timestamp when the transaction was created",
                        "example": "2023-10-05T12:00:00Z"
                    },
                    "orderId": {
                        "type": "string",
                        "description": "The associated order ID, if applicable",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "parlayId": {
                        "type": "string",
                        "description": "The associated parlay ID, if applicable",
                        "example": "123e4567-e89b-12d3-a456-426614174001"
                    },
                    "marketId": {
                        "type": "string",
                        "description": "The associated market ID, if applicable",
                        "example": "123e4567-e89b-12d3-a456-426614174002"
                    }
                },
                "required": [
                    "id",
                    "amount",
                    "type",
                    "currency",
                    "createdAt"
                ]
            },
            "WebSocketMessage": {
                "type": "object",
                "properties": {
                    "event": {
                        "type": "string",
                        "description": "The type of WebSocket event",
                        "enum": [
                            "book",
                            "place",
                            "fill",
                            "cancel",
                            "subscribe",
                            "unsubscribe",
                            "subscribed",
                            "unsubscribed"
                        ]
                    },
                    "data": {
                        "type": "object",
                        "description": "The payload of the WebSocket message"
                    }
                },
                "required": [
                    "event",
                    "data"
                ]
            },
            "SubscriptionRequest": {
                "type": "object",
                "properties": {
                    "event": {
                        "type": "string",
                        "enum": [
                            "subscribe",
                            "unsubscribe"
                        ],
                        "description": "The subscription event type"
                    },
                    "data": {
                        "type": "string",
                        "description": "The channel or market ID to subscribe to. Can be either a global channel name ('tape', 'lifecycle') or a UUID of an open market to receive updates only for that specific market."
                    }
                },
                "required": [
                    "event",
                    "data"
                ]
            },
            "SubscriptionResponse": {
                "type": "object",
                "properties": {
                    "event": {
                        "type": "string",
                        "enum": [
                            "subscribed",
                            "unsubscribed"
                        ],
                        "description": "The subscription acknowledgment event type"
                    },
                    "data": {
                        "type": "object",
                        "properties": {
                            "channel": {
                                "type": "string",
                                "description": "The channel or market ID that was subscribed to or unsubscribed from. Can be either a global channel name ('tape', 'lifecycle') or a UUID of a market."
                            }
                        },
                        "required": [
                            "channel"
                        ]
                    }
                },
                "required": [
                    "event",
                    "data"
                ]
            },
            "LifecycleEvent": {
                "type": "object",
                "description": "Bare payload - lifecycle ticks are not wrapped in an {event, data} envelope",
                "properties": {
                    "type": {
                        "type": "string",
                        "enum": [
                            "OPEN",
                            "END",
                            "CLOSE",
                            "START"
                        ],
                        "description": "The type of lifecycle event"
                    },
                    "market": {
                        "$ref": "#/components/schemas/MarketResponseDto"
                    }
                },
                "required": [
                    "type",
                    "market"
                ]
            },
            "BookEvent": {
                "type": "object",
                "description": "Bare payload - order book ticks are not wrapped in an {event, data} envelope",
                "properties": {
                    "type": {
                        "type": "string",
                        "enum": [
                            "PLACE",
                            "CANCEL"
                        ],
                        "description": "The type of book event"
                    },
                    "order": {
                        "$ref": "#/components/schemas/ObfuscatedOrderDto"
                    },
                    "fills": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ObfuscatedFillDto"
                        },
                        "description": "List of fills that occurred"
                    },
                    "market": {
                        "$ref": "#/components/schemas/MarketResponseDto"
                    }
                },
                "required": [
                    "type",
                    "order",
                    "fills",
                    "market"
                ]
            },
            "EventResponseDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The ID of the event",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "game": {
                        "$ref": "#/components/schemas/GameResponseDto",
                        "description": "The game associated with the event"
                    },
                    "type": {
                        "type": "string",
                        "description": "The type of the event",
                        "example": "REGULAR_SEASON"
                    },
                    "status": {
                        "type": "string",
                        "description": "The status of the event",
                        "enum": [
                            "INITIAL",
                            "OPEN_PREGAME",
                            "CLOSED_PREGAME",
                            "OPEN_INGAME",
                            "FINAL",
                            "DELAYED",
                            "CANCELED"
                        ],
                        "example": "OPEN_PREGAME"
                    },
                    "description": {
                        "type": "string",
                        "description": "The description of the event",
                        "example": "KC Chiefs vs BUF Bills - Week 14"
                    }
                },
                "required": [
                    "id",
                    "type",
                    "status",
                    "description"
                ]
            },
            "TeamResponseDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The ID of the team",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "name": {
                        "type": "string",
                        "description": "The name of the team",
                        "example": "Kansas City Chiefs"
                    },
                    "shortName": {
                        "type": "string",
                        "description": "The short name of the team",
                        "example": "Chiefs"
                    },
                    "symbol": {
                        "type": "string",
                        "description": "The symbol of the team",
                        "example": "KC"
                    },
                    "mascot": {
                        "type": "string",
                        "description": "The mascot of the team",
                        "example": "Chiefs"
                    }
                },
                "required": [
                    "id",
                    "name",
                    "shortName",
                    "symbol",
                    "mascot"
                ]
            },
            "GameResponseDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The ID of the game",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "league": {
                        "type": "string",
                        "description": "The league of the game",
                        "example": "NFL"
                    },
                    "status": {
                        "type": "string",
                        "description": "The status of the game",
                        "example": "SCHEDULED"
                    },
                    "scheduledStart": {
                        "type": "string",
                        "format": "date-time",
                        "description": "The scheduled start time of the game",
                        "example": "2023-12-10T20:00:00Z"
                    },
                    "homeTeam": {
                        "$ref": "#/components/schemas/TeamResponseDto",
                        "description": "The home team of the game"
                    },
                    "awayTeam": {
                        "$ref": "#/components/schemas/TeamResponseDto",
                        "description": "The away team of the game"
                    }
                },
                "required": [
                    "id",
                    "league",
                    "status",
                    "scheduledStart",
                    "homeTeam",
                    "awayTeam"
                ]
            },
            "CurrencyRequestDto": {
                "type": "object",
                "properties": {
                    "currency": {
                        "type": "string",
                        "description": "The currency denomination",
                        "example": "COIN"
                    }
                },
                "required": [
                    "currency"
                ]
            },
            "MarketFilterDTO": {
                "type": "object",
                "properties": {
                    "league": {
                        "type": "string",
                        "description": "The league to filter markets by",
                        "example": "NFL"
                    },
                    "marketType": {
                        "type": "string",
                        "description": "The type of market to filter by",
                        "example": "TOTAL"
                    }
                }
            },
            "ObfuscatedFillDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The ID of the fill",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "orderId": {
                        "type": "string",
                        "description": "The ID of the order that was filled",
                        "example": "123e4567-e89b-12d3-a456-426614174001"
                    },
                    "price": {
                        "type": "number",
                        "description": "The effective price of the fill in decimal probability",
                        "example": 0.225
                    },
                    "qty": {
                        "type": "number",
                        "description": "The quantity that was filled",
                        "example": 75
                    },
                    "isWash": {
                        "type": "boolean",
                        "description": "Whether the fill is a wash trade",
                        "example": false
                    },
                    "isTaker": {
                        "type": "boolean",
                        "description": "Whether the fill is the taker",
                        "example": true
                    },
                    "marketId": {
                        "type": "string",
                        "description": "The ID of the related market",
                        "example": "123e4567-e89b-12d3-a456-426614174002"
                    },
                    "outcomeId": {
                        "type": "string",
                        "description": "The ID of the related outcome",
                        "example": "123e4567-e89b-12d3-a456-426614174003"
                    }
                }
            },
            "EventWithMarketsDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The unique identifier of the event",
                        "example": "550e8400-e29b-41d4-a716-446655440000"
                    },
                    "type": {
                        "type": "string",
                        "description": "The type of event",
                        "example": "Game"
                    },
                    "status": {
                        "type": "string",
                        "description": "The current status of the event. `OPEN_INGAME` means the event is live — taker fees are charged only on fills matched while the event is live, and a live event's resting orders were cancelled when it went live",
                        "enum": [
                            "INITIAL",
                            "OPEN_PREGAME",
                            "CLOSED_PREGAME",
                            "OPEN_INGAME",
                            "FINAL",
                            "DELAYED",
                            "CANCELED"
                        ],
                        "example": "OPEN_PREGAME"
                    },
                    "description": {
                        "type": "string",
                        "description": "A human-readable description of the event",
                        "example": "Kansas City Chiefs @ Buffalo Bills"
                    },
                    "league": {
                        "type": "string",
                        "description": "The league this event belongs to",
                        "example": "NFL"
                    },
                    "scheduledStart": {
                        "type": "string",
                        "format": "date-time",
                        "description": "The scheduled start time of the event",
                        "example": "2025-01-26T18:30:00.000Z"
                    },
                    "game": {
                        "$ref": "#/components/schemas/GameResponseDto",
                        "description": "The game details associated with the event"
                    },
                    "marketIds": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "description": "Array of market IDs associated with this event",
                        "example": [
                            "market-uuid-1",
                            "market-uuid-2",
                            "market-uuid-3"
                        ]
                    }
                },
                "required": [
                    "id",
                    "type",
                    "status",
                    "description",
                    "league",
                    "scheduledStart",
                    "marketIds"
                ]
            },
            "MarketWithBookDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The ID of the market",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "description": {
                        "type": "string",
                        "description": "Description of the market",
                        "example": "KC v BUF Total"
                    },
                    "status": {
                        "type": "string",
                        "description": "The current status of the market (OPEN, CLOSED, or SETTLED)",
                        "example": "OPEN"
                    },
                    "strike": {
                        "type": "number",
                        "description": "The threshold of the market in the unit of the stat type",
                        "nullable": true,
                        "example": 26.5
                    },
                    "type": {
                        "type": "string",
                        "description": "The type of market (MONEY, SPREAD, TOTAL, RUSHING_ATTEMPTS, etc.)",
                        "example": "TOTAL"
                    },
                    "league": {
                        "type": "string",
                        "description": "The league of the market",
                        "example": "NFL"
                    },
                    "volume": {
                        "type": "number",
                        "description": "The total volume of the market in CASH denomination",
                        "example": 1000000
                    },
                    "eventId": {
                        "type": "string",
                        "description": "The event associated with the market",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "event": {
                        "$ref": "#/components/schemas/EventResponseDto",
                        "description": "The event details associated with the market"
                    },
                    "outcomeIds": {
                        "description": "Array of outcome IDs linked to this market",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "123e4567-e89b-12d3-a456-426614174002",
                            "123e4567-e89b-12d3-a456-426614174003"
                        ]
                    },
                    "outcomes": {
                        "description": "Array of outcomes linked to this market",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/OutcomeResponseDto"
                        }
                    },
                    "playerId": {
                        "type": "string",
                        "description": "The player associated with the market (if applicable)",
                        "nullable": true,
                        "example": "123e4567-e89b-12d3-a456-426614174001"
                    },
                    "player": {
                        "$ref": "#/components/schemas/PlayerResponseDto",
                        "description": "The player associated with the market (if applicable)",
                        "nullable": true
                    },
                    "competitor": {
                        "$ref": "#/components/schemas/TeamResponseDto",
                        "description": "The competitor associated with the market (if applicable)",
                        "nullable": true
                    },
                    "settledAt": {
                        "type": "string",
                        "description": "When the market was settled (if applicable)",
                        "nullable": true,
                        "example": "2023-10-05T12:00:00Z"
                    },
                    "book": {
                        "$ref": "#/components/schemas/BookResponseDto",
                        "description": "The current orderbook for this market"
                    }
                },
                "required": [
                    "id",
                    "description",
                    "status",
                    "type",
                    "league",
                    "volume",
                    "eventId",
                    "outcomeIds",
                    "outcomes",
                    "book"
                ]
            },
            "OutcomeResponseDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The ID of the outcome",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "description": {
                        "type": "string",
                        "description": "The description of the outcome",
                        "example": "Over 26.5"
                    },
                    "type": {
                        "type": "string",
                        "description": "The type of the outcome",
                        "nullable": true
                    },
                    "status": {
                        "type": "string",
                        "description": "The status of the outcome",
                        "example": "TBD"
                    },
                    "index": {
                        "type": "number",
                        "description": "The index of the outcome (0 = Home/Over, 1 = Away/Under)",
                        "example": 0
                    },
                    "last": {
                        "type": "number",
                        "description": "The last trade price for this outcome",
                        "nullable": true,
                        "example": 0.55
                    },
                    "competitor": {
                        "$ref": "#/components/schemas/TeamResponseDto",
                        "description": "The competitor associated with this outcome",
                        "nullable": true
                    }
                },
                "required": [
                    "id",
                    "description",
                    "type",
                    "status",
                    "index"
                ]
            },
            "PlayerResponseDto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The ID of the player",
                        "example": "123e4567-e89b-12d3-a456-426614174000"
                    },
                    "name": {
                        "type": "string",
                        "description": "The name of the player",
                        "nullable": true,
                        "example": "Josh Allen"
                    },
                    "fullName": {
                        "type": "string",
                        "description": "The full name of the player",
                        "nullable": true,
                        "example": "Joshua Patrick Allen"
                    },
                    "position": {
                        "type": "string",
                        "description": "The position of the player",
                        "nullable": true,
                        "example": "QB"
                    }
                },
                "required": [
                    "id"
                ]
            },
            "GetMarketsByEventsRequestDto": {
                "type": "object",
                "properties": {
                    "eventIds": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "description": "Array of event IDs to fetch markets for (1–50)",
                        "minItems": 1,
                        "maxItems": 50,
                        "example": [
                            "550e8400-e29b-41d4-a716-446655440000",
                            "550e8400-e29b-41d4-a716-446655440001"
                        ]
                    },
                    "currency": {
                        "type": "string",
                        "enum": [
                            "CASH",
                            "COIN"
                        ],
                        "description": "Currency denomination for orderbook data"
                    }
                },
                "required": [
                    "eventIds",
                    "currency"
                ]
            },
            "StrikeRequestDto": {
                "type": "object",
                "properties": {
                    "marketId": {
                        "type": "string",
                        "format": "uuid",
                        "description": "The ID of an existing market to request a new strike for",
                        "example": "550e8400-e29b-41d4-a716-446655440000"
                    },
                    "strike": {
                        "type": "number",
                        "description": "The requested strike value. Accepts whole numbers (e.g. 300) or half-points (e.g. 300.5). Whole numbers are automatically converted to .5 strikes.",
                        "example": 300.5
                    }
                },
                "required": [
                    "marketId",
                    "strike"
                ]
            },
            "StrikeRequestResponseDto": {
                "type": "object",
                "properties": {
                    "message": {
                        "type": "string",
                        "description": "Confirmation message with the event description and final strike value",
                        "example": "Strike request created for TOR @ CLE at 300.5"
                    }
                }
            },
            "CancelBatchResponse": {
                "type": "object",
                "description": "The result of a batch cancel. `200`: we cancelled every order. `207`: we skipped some orders, see `notCanceled`. `404`: we did not find an ID.",
                "properties": {
                    "canceled": {
                        "type": "array",
                        "description": "The orders we sent a cancel for, in request order",
                        "items": {
                            "$ref": "#/components/schemas/OrderResponseDto"
                        }
                    },
                    "notCanceled": {
                        "type": "array",
                        "description": "The IDs we sent no cancel for, in request order, each with a reason",
                        "items": {
                            "$ref": "#/components/schemas/NotCanceled"
                        }
                    }
                },
                "required": [
                    "canceled",
                    "notCanceled"
                ]
            },
            "NotCanceled": {
                "type": "object",
                "description": "One order ID from the request that we sent no cancel for",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "The ID as given in the request",
                        "example": "123e4567-e89b-12d3-a456-426614174002"
                    },
                    "reason": {
                        "$ref": "#/components/schemas/NotCanceledReason"
                    }
                },
                "required": [
                    "id",
                    "reason"
                ]
            },
            "NotCanceledReason": {
                "type": "string",
                "description": "Why we skipped an ID: `NOT_FOUND`, or the stored status of an order the matcher has already completed",
                "enum": [
                    "NOT_FOUND",
                    "FILLED",
                    "CANCELED",
                    "REJECTED"
                ],
                "example": "FILLED"
            },
            "BatchPlaceError": {
                "type": "object",
                "description": "The `422` body of a refused batch place. A balance refusal sets `code` and `errors`.",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Insufficient balance"
                    },
                    "error": {
                        "type": "string",
                        "example": "Unprocessable Entity"
                    },
                    "statusCode": {
                        "type": "integer",
                        "example": 422
                    },
                    "code": {
                        "type": "string",
                        "enum": [
                            "INSUFFICIENT_BALANCE"
                        ]
                    },
                    "errors": {
                        "type": "array",
                        "description": "Each order your balance cannot cover on its own, in request order. Present on a balance refusal.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "index": {
                                    "type": "integer",
                                    "description": "The order's position in your request, counting from zero."
                                },
                                "outcomeId": {
                                    "type": "string",
                                    "format": "uuid"
                                },
                                "reason": {
                                    "type": "string",
                                    "example": "Insufficient balance"
                                }
                            },
                            "required": [
                                "index",
                                "outcomeId",
                                "reason"
                            ]
                        }
                    }
                },
                "required": [
                    "message",
                    "error",
                    "statusCode"
                ]
            }
        }
    }
}
