Backpack Exchange WebSocket Streams API

Real-time market and account event streams over WebSocket. Public streams cover ticker, depth, trades, klines, mark price, open interest, and liquidation events keyed by symbol. Private (signed) streams cover per-symbol order updates (account.orderUpdate.), position updates (account.position), and RFQ updates (account.rfqUpdate). Signing uses the same ED25519 instruction model as the REST API (subscribe instruction).

OpenAPI Specification

backpack-exchange-openapi.yml Raw ↑
openapi: 3.0.0
info:
  title: Backpack Exchange API
  description: "\n# Introduction\n\nWelcome to the Backpack Exchange API. This API is for programmatic trade execution. All\
    \ of the endpoints require requests to be signed with an ED25519 keypair for authentication.\n\nThe API is hosted at `https://api.backpack.exchange/`\
    \ and the WS API is hosted at `wss://ws.backpack.exchange/`.\n\n# Authentication\n\n\n## Signing requests\n\nSigned requests\
    \ are required for any API calls that mutate state. Additionally, some read only requests can be performed by signing\
    \ or via session authentication.\n\nSigned requests require the following additional headers:\n\n- `X-Timestamp` - Unix\
    \ time in milliseconds that the request was sent.\n- `X-Window` - Time window in milliseconds that the request is valid\
    \ for, default is `5000` and maximum is `60000`.\n- `X-API-Key` - Base64 encoded verifying key of the ED25519 keypair.\n\
    - `X-Signature` - Base64 encoded signature generated according to the instructions below.\n\n### Generate ED25519 Keys\n\
    \nYou can generate a private/public ED25519 keypair using this Python one-liner:\n\n```python\npython3 -c \"from cryptography.hazmat.primitives.asymmetric\
    \ import ed25519; import base64; key = ed25519.Ed25519PrivateKey.generate(); seed = key.private_bytes_raw(); pub = key.public_key().public_bytes_raw();\
    \ print(f'Seed: {base64.b64encode(seed).decode()}\\nPublic Key: {base64.b64encode(pub).decode()}')\"\n```\n\nThis will\
    \ output your base64-encoded private key (seed) and public key that can be used for API authentication.\n\n### Signature\
    \ Generation\n\nTo generate a signature perform the following:\n\n1) The key/values of the request body or query parameters\
    \ should be ordered alphabetically and then turned into query string format.\n\n2) Append the header values for the timestamp\
    \ and receive window to the above generated string in the format `&timestamp=<timestamp>&window=<window>`. If no `X-Window`\
    \ header is passed the default value of `5000` still needs to be added to the signing string.\n\nEach request also has\
    \ an instruction type, valid instructions are:\n\n```\naccountQuery\nbalanceQuery\nborrowLendExecute\nborrowHistoryQueryAll\n\
    collateralQuery\ndepositAddressQuery\ndepositQueryAll\nfillHistoryQueryAll\nfundingHistoryQueryAll\ninterestHistoryQueryAll\n\
    orderCancel\norderCancelAll\norderExecute\norderHistoryQueryAll\norderQuery\norderQueryAll\npnlHistoryQueryAll\npositionHistoryQueryAll\n\
    positionQuery\nquoteSubmit\nstrategyCancel\nstrategyCancelAll\nstrategyCreate\nstrategyHistoryQueryAll\nstrategyQuery\n\
    strategyQueryAll\nwithdraw\nwithdrawalQueryAll\n```\n\nThe correct instruction type should be prefixed to the signing\
    \ string. The instruction types for each request are documented alongside the request.\n\nFor example, an API request\
    \ to cancel an order with the following body:\n\n```json\n{\n    \"orderId\": 28\n    \"symbol\": \"BTC_USDT\",\n}\n```\n\
    \nWould require the following to be signed:\n\n```text\ninstruction=orderCancel&orderId=28&symbol=BTC_USDT&timestamp=1614550000000&window=5000\n\
    ```\n\nRegarding batch order execution (`POST /orders`), for each order in the batch, the order parameters should be ordered\
    \ alphabetically and then turned into query string format. The orderExecute instruction should then be prefixed to that\
    \ string.\nThe query strings for the orders should be concatenated with `&` and the timestamp and window appended at the\
    \ end.\n\nFor example, an API request for an order execution batch with the following body:\n\n```json\n[\n    {\n   \
    \     \"symbol\": \"SOL_USDC_PERP\",\n        \"side\": \"Bid\",\n        \"orderType\": \"Limit\",\n        \"price\"\
    : \"141\",\n        \"quantity\": \"12\"\n    },\n    {\n        \"symbol\": \"SOL_USDC_PERP\",\n        \"side\": \"\
    Bid\",\n        \"orderType\": \"Limit\",\n        \"price\": \"140\",\n        \"quantity\": \"11\"\n    }\n]\n```\n\n\
    Would require the following to be signed:\n\n```text\ninstruction=orderExecute&orderType=Limit&price=141&quantity=12&side=Bid&symbol=SOL_USDC_PERP&instruction=orderExecute&orderType=Limit&price=140&quantity=11&side=Bid&symbol=SOL_USDC_PERP&timestamp=1750793021519&window=5000\n\
    ```\n\nIf the API endpoint requires query parameters instead of a request body, the same procedure should be used on the\
    \ query parameters. If the API endpoint does not have a request body or query parameters, only the timestamp and receive\
    \ window need to be signed.\n\nThis message should be signed using the private key of the ED25519 keypair that corresponds\
    \ to the public key in the `X-API-Key` header. The signature should then be base64 encoded and submitted in the `X-Signature`\
    \ header.\n\n\n<br /><br />\n\n---\n\n\n# Infrastructure\n\nOrders are processed through a single linear command stream.\
    \ All orders from all API instances feed into one stream, which is consumed by the matching engine sequentially.\n\n##\
    \ Architecture\n\n```mermaid\nflowchart TB\n    subgraph Client[\"Client\"]\n        direction LR\n        REST[\"REST\
    \ API Client\"]\n        WSC[\"WebSocket Client\"]\n    end\n\n    subgraph Edge[\"Edge\"]\n        direction LR\n   \
    \     WAF[\"WAF\"]\n        CDN[\"CDN\"]\n    end\n\n    ALB[\"Load Balancer\"]\n    API[\"API<br/><i>N pods, Pre-validation</i>\"\
    ]\n    BUS[\"Message Bus\"]\n\n    subgraph Engine[\"Matching Engine\"]\n        direction LR\n        CLEARING[\"Clearing\"\
    ]\n        OB[\"Order Book\"]\n        SETTLE[\"Settlement\"]\n    end\n\n    WSLB[\"WebSocket LB\"]\n    APIWS[\"WebSocket\
    \ API<br/><i>N pods</i>\"]\n\n    subgraph Persistence[\"Persistence\"]\n        direction LR\n        DB[\"Database\"\
    ]\n        SNAP[\"Snapshots\"]\n    end\n\n    REST <-->|\"Order / Execution Response\"| WAF\n    WAF <--> CDN\n    CDN\
    \ <--> ALB\n    ALB <--> API\n    API <--> BUS\n    BUS <--> Engine\n\n    CLEARING --> OB\n    OB --> SETTLE\n\n    Engine\
    \ --> WSLB\n    WSLB --> APIWS\n    APIWS -->|\"Order Updates / Depth / Trades\"| WSC\n\n    Engine -.-> Persistence\n\
    \n    classDef hotpath fill:#ff6b6b,stroke:#c0392b,color:#fff\n    classDef bus fill:#f39c12,stroke:#e67e22,color:#fff\n\
    \    classDef client fill:#3498db,stroke:#2980b9,color:#fff\n    classDef persist fill:#95a5a6,stroke:#7f8c8d,color:#fff\n\
    \    classDef edge fill:#1abc9c,stroke:#16a085,color:#fff\n\n    class REST,WSC client\n    class WAF,CDN,ALB,WSLB edge\n\
    \    class API,APIWS,CLEARING,OB,SETTLE hotpath\n    class BUS bus\n    class DB,SNAP persist\n```\n\n## Order Lifecycle\n\
    \n```mermaid\n%%{init: {'theme': 'neutral', 'themeVariables': {'fontSize': '12px'}}}%%\nsequenceDiagram\n    participant\
    \ Client as Client\n    participant API as API\n    participant Engine as Matching Engine\n    participant WS as WebSocket\
    \ API\n    Client->>+API: POST /api/v1/order (signed)\n    API->>+Engine: Order command\n    Note over Engine: Clear \u2192\
    \ Match \u2192 Settle\n    Engine-->>-API: Execution response\n    API->>-Client: HTTP 200 \u2014 Order result\n    Engine->>WS:\
    \ Engine events\n    WS->>Client: Order updates / Depth / Trades\n```\n\n\n\n<br /><br />\n\n---\n\n# Changelog\n\n##\
    \ 2025-11-12\n\n- Backstop liquidation fills now include a non-zero `tradeId` field on an on-going basis. Previously such\
    \ fills had a\n  zero `tradeId`. This applies to the `/fills` endpoint as well as the trade stream.\n\n## 2025-11-10\n\
    \n- Add a specific error message for withdrawal attempts to non-2FA exempt withdrawal addresses.\n- Set a default limit\
    \ of `1000` levels each side of the book for `/depth` endpoint.\n\n## 2025-10-23\n\n- Add `j` and `k` fields to the order\
    \ update stream (take profit limit price and stop loss limit price).\n\n## 2025-09-02\n\n- The `/depth` endpoint now returns\
    \ a limit of 5,000 price levels on each side of the book.\n\n## 2025-09-01\n\n- The `cumulativeInterest` response field\
    \ is being removed from the `/position`endpoint.\n- Estimated liquidation price or `l` is being removed from the position\
    \ update stream. It will remain as a placeholder\n  and be set to 0. It will be removed in the future, so client's should\
    \ not rely on its presence.\n- Liquidation price can be queried for a single position using the Positions API `/position`\
    \ for example\n  `/position?symbol=BTC_USDC_PERP`.\n\n## 2025-08-07\n\n- `/history/pnl` has been removed.\n\n## 2025-06-08\n\
    \n- The order id format is changing, it is no longer a byte shifted timestamp. It is no longer possible to derive the\n\
    \  order timestamp from the order id. This change will take place at Monday June 9th, 01:00 UTC.\n\n## 2025-04-22\n\n\
    - The `/fills` endpoint now returns all fills for the account, including fills from system orders as well as client\n\
    \  orders. System orders include liquidations, ADLs and collateral conversions. Previously, by default, it only returned\n\
    \  fills from client orders. This behavior can be achieved by setting the `fillType` parameter to `User`.\n\n## 2025-04-08\n\
    \n- Added funding rate lower and upper bounds to `/markets` and `/market` endpoints.\n\n## 2025-03-26\n\n- Add open interest\
    \ stream `openInterest.<symbol>`.\n- Added the option to query `/history/borrowLend/positions` with a signed request using\
    \ the instruction\n  `borrowPositionHistoryQueryAll`.\n\n## 2025-03-19\n\n- The leverage filter has been removed from\
    \ `/markets` and `/market` endpoints.\n- Added `/openInterest` now takes `symbol` as an optional parameter. When not set,\
    \ all markets are returned.\n- `/openInterests` has been deprecated.\n- Add stop loss and take profit fields to `/orders/execute`.\n\
    - Add `I` field to the order update stream (related order id).\n- Add `a` and `b` fields to the order update stream (take\
    \ profit trigger price and stop loss trigger price).\n\n## 2025-02-28\n\n- Added `clientId` to fill history.\n\n## 2025-02-11\n\
    \n- An `O` field has been added to the order update stream. It denotes the origin of the update. The possible values are:\n\
    \    - `USER`: The origin of the update was due to order entry by the user.\n    - `LIQUIDATION_AUTOCLOSE`: The origin\
    \ of the update was due to a liquidation by the liquidation engine.\n    - `ADL_AUTOCLOSE`: The origin of the update was\
    \ due to an ADL (auto-deleveraging) event.\n    - `COLLATERAL_CONVERSION`: The origin of the update was due to a collateral\
    \ conversion to settle debt on the\n      account.\n    - `SETTLEMENT_AUTOCLOSE`: The origin of the update was due to\
    \ the settlement of a position on a dated market.\n    - `BACKSTOP_LIQUIDITY_PROVIDER`: The origin of the update was due\
    \ to a backstop liquidity provider facilitating a\n      liquidation.\n\n## 2025-02-07\n\n- Added `r` to denote a reduce\
    \ only order on the order updates stream.\n- Added `reduceOnly` to the get orders endpoint.\n\n## 2025-02-03\n\n- Added\
    \ `openInterestLimit` to the markets endpoint. Applicable to futures markets only.\n- Added `orderModified` event to the\
    \ order update stream. A resting reduce only order's quantity can be decreased in\n  order to prevent position side reversal.\n\
    \n## 2025-01-09\n\n- Added `marketType` to the markets endpoint.\n- Added an optional `marketType` filter to the fills\
    \ and the orders endpoints.\n\n## 2024-12-03\n\n- Add order expiry reason to order update stream.\n- Add `cumulativeInterest`\
    \ to borrow lend position.\n\n## 2024-12-02\n\n- Add borrow lend history per position endpoint.\n\n## 2024-11-10\n\n-\
    \ Add `timestamp` field denoting the system time in unix-epoch microseconds to the depth endpoint.\n\n## 2024-10-15\n\n\
    - Convert all error responses to JSON and add a error code.\n\n## 2024-05-14\n\n- Add `executedQuantity` and `executedQuoteQuantity`\
    \ to order history endpoint.\n\n## 2024-05-03\n\n- Add single market order update stream `account.orderUpdate.<symbol>`.\n\
    \n## 2024-05-02\n\n- Add optional `from` and `to` timestamp to get withdrawals endpoint.\n\n## 2024-05-01\n\n- Add optional\
    \ `from` and `to` timestamp to get deposits endpoint.\n\n## 2024-03-14\n\n- Add optional `orderId` filter to order history\
    \ endpoint.\n- Add optional `from` and `to` timestamp to order fills endpoint.\n\n## 2024-02-28\n\n- Return the withdrawal\
    \ in request withdrawal response.\n\n## 2024-02-24\n\n- An additional field `t` was added to the private order update\
    \ stream. It is the `trade_id` of the fill that generated\n  the order update.\n- Added a maximum value for the `X-Window`\
    \ header of `60000`.\n\n## 2024-01-16\n\n### Breaking\n\n- A new websocket API is available at `wss://ws.backpack.exchange`.\
    \ Please see the documentation. The previous API\n  remains on the same endpoint and will be deprecated after a migration\
    \ period. The new API changes the following:\n    - Subscription endpoint is now `wss://ws.backpack.exchange` instead\
    \ of `wss://ws.backpack.exchange/stream`.\n    - Can subscribe and unsubscribe to/from multiple streams by passing more\
    \ than one in the `params` field.\n    - Signature should now be sent in a separate `signature` field.\n    - Signature\
    \ instruction changed from `accountQuery` to `subscribe`.\n    - Event and engine timestamps are now in `microseconds`\
    \ instead of `milliseconds`.\n    - Add engine timestamp to `bookTicker`, `depth`, and `order` streams.\n    - Add quote\
    \ asset volume to ticker stream.\n    - Add sequential trade id to trade stream.\n    - Rename the event type in the depth\
    \ stream from `depthEvent` to `depth`.\n    - Change the format of streams from `<symbol>@<type>` to `<type>.<symbol>`\
    \ or `kline.<interval>.<symbol>` for\n      K-lines.\n    - Flatten the K-Line in the K-line stream so its not nested.\n\
    \n## 2024-01-11\n\n### Breaking\n\n- Replaced `identifier` field on deposits with `transaction_hash` and `provider_id`.\n\
    \  This aims to provide clearer representation of the field, particularly for fiat deposits.\n- Removed duplicate `pending`\
    \ values from the `WithdrawalStatus` and `DepositStatus` spec enum.\n\n\n<br /><br />\n\n---\n    "
  version: '1.0'
  x-logo:
    url: https://cdn.prod.website-files.com/66830ad123bea7f626bcf58f/68eccb03852237fd98ffad9b_Backpack-Icon-Color.svg
    altText: Backpack Exchange
  contact:
    name: Backpack Exchange Support
    url: https://support.backpack.exchange/
  license:
    name: Proprietary
servers:
- url: https://api.backpack.exchange
tags:
- name: API Keys
  description: API key management.
- name: Account
  description: Account settings and limits.
- name: Account Limits
  description: Account limits.
- name: Achievements
  description: Achievements.
- name: Address
  description: Saved addresses.
- name: Affiliate
  description: Affiliate program.
- name: Assets
  description: Assets and collateral data.
- name: Auth
  description: Authentication.
- name: Banxa
  description: Banxa fiat on-ramp.
- name: Bolt Card
  description: Bolt card.
- name: Borrow Lend
  description: Borrowing and lending.
- name: Borrow Lend Markets
  description: Borrowing and lending.
- name: Broker
  description: Broker.
- name: Capital
  description: Capital management.
- name: Chat
  description: Chat messaging service.
- name: Country
  description: Country data.
- name: Disclosures
  description: Disclosures.
- name: Documents
  description: Document uploads.
- name: Easy Euro
  description: Easy Euro fiat.
- name: Entity
  description: Corporate entities.
- name: Entity KYC
  description: Entity KYC details.
- name: Equals Money
  description: Equals Money fiat.
- name: European Private Beta
  description: EU private beta.
- name: FTX Creditor Claims
  description: FTX Creditor Claims.
- name: FTX EU Claims
  description: FTX EU claims.
- name: Fee Tiers
  description: Fee tiers.
- name: Front
  description: Front customer service webhooks.
- name: Keypair
  description: Keypairs.
- name: Know Your Customer
  description: KYC verification.
- name: Know Your Transaction
  description: KYT compliance.
- name: League
  description: Private leagues and leaderboards.
- name: Market Data
  description: Market data.
- name: Markets
  description: Public market data.
- name: Notification History
  description: Notification history (inbox) for the authenticated user.
- name: Notifications
  description: Notifications.
- name: Order
  description: Order management.
- name: Passkeys
  description: Passkey authentication.
- name: Performance
  description: Performance.
- name: Plaid
  description: Plaid bank linking.
- name: Portfolio
  description: Portfolio.
- name: Position
  description: Positions and futures data.
- name: Prediction
  description: Prediction events.
- name: Preferences
  description: Preferences.
- name: Price Notifications
  description: Price notifications.
- name: Proof of Reserves
  description: Proof of reserves.
- name: Public Profile
  description: Public profile.
- name: RFQ
  description: RFQ (Request For Quote) - Maker.
- name: Referrals
  description: Referral program.
- name: Rewards
  description: Rewards.
- name: Risk Dashboard
  description: Risk dashboard.
- name: Safe
  description: Safe data.
- name: Satoshi Test
  description: Satoshi test.
- name: Service
  description: Service tokens.
- name: Session
  description: Login sessions.
- name: Social Connections
  description: Social account connections.
- name: Staking
  description: Staking.
- name: Statistics
  description: Statistics.
- name: Stocks
  description: Stock market data.
- name: Strategy
  description: Strategies.
- name: Streams
  description: "# Usage\n\n## Subscribing\n\nTo use the websocket API, connect to\n`wss://ws.backpack.exchange`.\n\nTo subscribe\
    \ to a stream with the name `stream` send a text frame\nover the websocket connection with the following JSON payload:\n\
    \n```\n{\n  \"method\": \"SUBSCRIBE\",\n  \"params\": [\"stream\"]\n}\n```\n\nSimilarly, to unsubscribe from a stream\
    \ with the name `stream`:\n\n```\n{\n  \"method\": \"UNSUBSCRIBE\",\n  \"params\": [\"stream\"]\n}\n```\n\nYou can subscribe\
    \ or unsubscribe from multiple streams if you include\nmore than one in the params field.\n\nAll data from streams is\
    \ wrapped in a JSON object of the following form:\n\n```\n{\n  \"stream\": \"<stream>\",\n  \"data\": \"<payload>\"\n\
    }\n```\n\nThe following command can be used to test subscribing to a stream:\n```\n(sleep 1; \\\necho '{\"method\":\"\
    SUBSCRIBE\",\"params\":[\"depth.SOL_USDC\"]}';\\\ncat) |\\\nwscat -c wss://ws.backpack.exchange\n```\nThe payloads for\
    \ each stream time are outlined below.\n\n## Timing\n\nTimestamps are in microseconds (except for the K-line start and\
    \ end\ntimes). The event timestamp is the time the event was emitted from\nthe websocket server, and the engine timestamp\
    \ is the time the event\nwas generated by the matching engine.\n\nIf a message aggregates more than one event (for example,\
    \ a depth\nmessage), the engine timestamp will be the timestamp of the last\nmatching engine event.\n\n## Keeping the\
    \ connection alive\n\nTo keep the connection alive, a `Ping` frame will be sent from the\nserver every 60s, and a `Pong`\
    \ is expected to be received from the\nclient. If a `Pong` is not received within 120s, a `Close` frame will be\nsent\
    \ and the connection will be closed.\n\nIf the server is shutting down, a `Close` frame will be sent and then a\ngrace\
    \ period of 30s will be given before the connection is closed. The\nclient should reconnect after receiving the `Close`\
    \ frame. The client\nwill be reconnected to a server that is not shutting down.\n\n# Private\n\nSubscribing to a private\
    \ stream requires a valid signature generated\nfrom an ED25519 keypair. For stream subscriptions, the signature\nshould\
    \ be of the form:\n\n```text\ninstruction=subscribe&timestamp=1614550000000&window=5000\n```\n\nWhere the timestamp and\
    \ window are in milliseconds.\n\nPrivate streams are prefixed with `account.` and require signature data\nto be submitted\
    \ in the subscribe parameters. The verifying key and\nsignature should be base64 encoded.\n\n```\n{\n  \"method\": \"\
    SUBSCRIBE\",\n  \"params\": [\"stream\"],\n  \"signature\": [\"<verifying key>\", \"<signature>\", \"<timestamp>\", \"\
    <window>\"]\n}\n````\n\n## Order update\n\nOn any mutation to an order the order will be pushed to the order update\n\
    stream. The event type of the order update will be one of the\nfollowing:\n\n- `orderAccepted`\n- `orderCancelled`\n-\
    \ `orderExpired`\n- `orderFill`\n- `orderModified`\n- `triggerPlaced`\n- `triggerFailed`\n\nAn `orderModified` update\
    \ will be received when a resting reduce only\norder's quantity is decreased in order to prevent position side\nreversal.\n\
    \n### Stream Name Format\n- For all markets: `account.orderUpdate`\n- For single market: `account.orderUpdate.<symbol>`\n\
    \n```\n{\n  \"e\": \"orderAccepted\",   // Event type\n  \"E\": 1694687692980000,  // Event time in microseconds\n  \"\
    s\": \"SOL_USD\",         // Symbol\n  \"c\": 123,               // Client order ID\n  \"S\": \"Bid\",             //\
    \ Side\n  \"o\": \"LIMIT\",           // Order type\n  \"f\": \"GTC\",             // Time in force\n  \"q\": \"32123\"\
    ,           // Quantity\n  \"Q\": \"32123\",           // Quantity in quote\n  \"p\": \"20\",              // Price\n\
    \  \"P\": \"21\",              // Trigger price\n  \"B\": \"LastPrice\",       // Trigger by\n  \"a\": \"30\",       \
    \       // Take profit trigger price\n  \"b\": \"10\",              // Stop loss trigger price\n  \"j\": \"30\",     \
    \         // Take profit limit price\n  \"k\": \"10\",              // Stop loss limit price\n  \"d\": \"MarkPrice\",\
    \       // Take profit trigger by\n  \"g\": \"IndexPrice\",      // Stop loss trigger by\n  \"Y\": \"10\",           \
    \   // Trigger quantity\n  \"X\": \"New\",             // Order state\n  \"R\": \"PRICE_BAND\",      // Order expiry reason\n\
    \  \"i\": \"1111343026172067\" // Order ID\n  \"t\": 567,               // Trade ID\n  \"l\": \"1.23\",            //\
    \ Fill quantity\n  \"z\": \"321\",             // Executed quantity\n  \"Z\": \"123\",             // Executed quantity\
    \ in quote\n  \"L\": \"20\",              // Fill price\n  \"m\": true,              // Whether the order was maker\n\
    \  \"n\": \"23\",              // Fee\n  \"N\": \"USD\",             // Fee symbol\n  \"V\": \"RejectTaker\",     // Self\
    \ trade prevention\n  \"T\": 1694687692989999,  // Engine timestamp in microseconds\n  \"O\": \"USER\"             //\
    \ Origin of the update\n  \"I\": \"1111343026156135\" // Related order ID\n  \"H\": 6023471188         // Strategy ID\n\
    \  \"y\": true               // Post only\n}\n```\n\nThere are several possible values for the `O` field (origin of the\n\
    update):\n- `USER`: The origin of the update was due to order entry by the user.\n- `LIQUIDATION_AUTOCLOSE`: The origin\
    \ of the update was due to a\nliquidation by the liquidation engine.\n- `ADL_AUTOCLOSE`: The origin of the update was\
    \ due to an ADL\n(auto-deleveraging) event.\n- `COLLATERAL_CONVERSION`: The origin of the update was due to a\ncollateral\
    \ conversion to settle debt on the account.\n- `SETTLEMENT_AUTOCLOSE`: The origin of the update was due to the\nsettlement\
    \ of a position on a dated market.\n- `BACKSTOP_LIQUIDITY_PROVIDER`: The origin of the update was due to a\nbackstop liquidity\
    \ provider facilitating a liquidation.\n\nSome fields are conditional on the order settings or event type:\n\n- `c` -\
    \ Only present if the order has a client order ID.\n- `q` - Only present if the order has a quantity set.\n- `Q` - Only\
    \ present if the order is reverse market order.\n- `p` - Only present if the order is a limit order.\n- `P` - Only present\
    \ if the order is a trigger order.\n- `B` - Only present if the order is a trigger order.\n- `a` - Only present if the\
    \ order has a take profit trigger price set.\n- `b` - Only present if the order has a stop loss trigger price set.\n-\
    \ `d` - Only present if the order has a take profit trigger price set.\n- `g` - Only present if the order has a stop loss\
    \ trigger price set.\n- `Y` - Only present if the order is a trigger order.\n- `R` - Only present if the event is a `orderExpired`\
    \ event.\n- `t` - Only present if the event is a `orderFill` event.\n- `l` - Only present if the event is a `orderFill`\
    \ event.\n- `L` - Only present if the event is a `orderFill` event.\n- `m` - Only present if the event is a `orderFill`\
    \ event.\n- `n` - Only present if the event is a `orderFill` event.\n- `N` - Only present if the event is a `orderFill`\
    \ event.\n\n## Position update\n\nOn any mutation to a position the position will be pushed to the\nposition update stream.\
    \ The event type of the position update will\nbe one of the following:\n\n- `positionAdjusted`\n- `positionOpened`\n-\
    \ `positionClosed`\n\nOn subscription, a message will be sent to the client with the current\nopen positions, if any.\
    \ The `e` field will not be present in the\nmessage.\n\n### Stream Name Format\n- For all markets: `account.positionUpdate`\n\
    - For single market: `account.positionUpdate.<symbol>`\n\n```\n{\n  \"e\": \"positionOpened\",  // Event type\n  \"E\"\
    : 1694687692980000,  // Event time in microseconds\n  \"s\": \"SOL_USDC_PERP\",    // Symbol\n  \"b\": 123,          \
    \     // Break event price\n  \"B\": 122,               // Entry price\n  \"f\": 0.5,               // Initial margin\
    \ fraction\n  \"M\": 122,               // Mark price\n  \"m\": 0.01,              // Maintenance margin fraction\n  \"\
    q\": 5,                 // Net quantity\n  \"Q\": 6,                 // Net exposure quantity\n  \"n\": 732 ,        \
    \      // Net exposure notional\n  \"i\": \"1111343026172067\" // Position ID\n  \"p\": \"-1\",              // PnL realized\n\
    \  \"P\": \"0\",               // PnL unrealized\n  \"T\": 1694687692989999   // Engine timestamp in microseconds\n}\n\
    ```\n\nThe net quantity field will be positive if the position is long and\nnegative if the position is short.\n\nThe\
    \ net exposure quantity field includes exposure from the open\nposition, as well as any open orders.\n\n## RFQ Update\n\
    \nThis WebSocket stream provides real-time updates on RFQs (Request for\nQuotes) that are relevant to makers. Events are\
    \ pushed to this\nstream whenever there is a significant state change in an RFQ or its\nassociated quotes, allowing makers\
    \ to monitor and respond to RFQs as\nthey progress through various states.\n\n### Event Types\n\nFor RFQs that submitted\
    \ by other requesters.\n- `rfqActive`: Indicates that an RFQ is active and open for quotes.\n\nFor RFQs that submitted\
    \ by your account.\n- `rfqAccepted`: Indicates that an RFQ has been accepted and is no\n- `rfqRefreshed`: Indicates that\
    \ an RFQ has been refreshed, is active\nand open for quotes.\n- `rfqCancelled`: Indicates that an RFQ has been cancelled\
    \ or expired.\n- `rfqCandidate`: RFQ has received a new best quote.\n- `rfqFilled`: Indicates that an RFQ has been fully\
    \ filled with a quote.\n\nFor Quotes submitted by your account.\n- `quoteAccepted`: Indicates that a quote submitted by\
    \ the maker has\nbeen accepted.\n- `quoteCancelled`: Indicates that a quote has been cancelled due to\nquote submission,\
    \ RFQ being filled, refreshed, cancelled, or expired.\n\n### Quote Submission and RFQ Timing\n\nMakers should submit quotes\
    \ before the **submission time** (`w` field)\nis reached, as indicated in each `rfqActive` event. An RFQ remains\nactive\
    \ until the **expiration time** (`W` field). If no quote is\naccepted or the RFQ is not cancelled, makers may continue\
    \ to submit\nquotes until expiration.\n\nRFQs can periodically request new quotes by issuing additional\n`rfqActive` events.\
    \ Each new `rfqActive` event will have the same\nRFQ ID (`R` field) but updated values for **submission time** and\n**expiration\
    \ time**, allowing makers to participate in extended or\nrenewed quoting periods for ongoing RFQs.\n\n### Stream Name\
    \ Format\n- For all markets: `account.rfqUpdate`\n- For single market: `account.rfqUpdate.<symbol>`\n\n### Example Messages\n\
    \n**RFQ Accepted** (sent to requester)\n```\n{\n  \"e\": \"rfqAccepted\",            // Event type\n  \"E\": 1730225420369829,\
    \         // Event time in microseconds\n  \"R\": 113392053149171712,       // RFQ ID\n  \"C\": \"123\",             \
    \       // Client RFQ ID\n  \"s\": \"SOL_USDC_RFQ\",           // Symbol\n  \"S\": \"Bid\",                    // RFQ\
    \ side\n  \"q\": \"10\",                     // Quantity (if quantity in base asset)\n  \"w\": 1730225480368,        \
    \    // Submission time in milliseconds\n  \"W\": 1730225540368,            // Expiry time in milliseconds\n  \"X\": \"\
    New\",                    // RFQ status\n  \"T\": 1730225420368765          // Engine timestamp in microseconds\n}\n```\n\
    \n**RFQ Active** (broadcast to all rfq listeners)\n```\n{\n  \"e\": \"rfqActive\",              // Event type\n  \"E\"\
    : 1730225420369829,         // Event time in microseconds\n  \"R\": 113392053149171712,       // RFQ ID\n  \"s\": \"SOL_USDC_RFQ\"\
    ,           // Symbol\n  \"q\": \"10\",                     // Quantity (optional) (if quantity in base asset)\n  \"w\"\
    : 1730225480368,            // Submission time in milliseconds\n  \"W\": 1730225540368,            // Expiry time in milliseconds\n\
    \  \"X\": \"New\",                    // RFQ status\n  \"T\": 1730225420368765          // Engine timestamp in microseconds\n\
    }\n```\n\n**RFQ Refreshed** (sent to requester)\n```\n{\n  \"e\": \"rfqRefreshed\",           // Event type\n  \"E\":\
    \ 1730225450369829,         // Event time in microseconds\n  \"R\": 113392053149171712,       // RFQ ID\n  \"C\": \"123\"\
    ,                    // Client RFQ ID\n  \"s\": \"SOL_USDC_RFQ\",           // Symbol\n  \"S\": \"Bid\",             \
    \       // RFQ side\n  \"q\": \"10\",                     // Quantity (optional) (if quantity in base asset)\n  \"w\"\
    : 1730225480368,            // Submission time in milliseconds\n  \"W\": 1730225540368,            // Expiry time in milliseconds\n\
    \  \"X\": \"New\",                    // RFQ status\n  \"T\": 1730225450368765          // Engine timestamp in microseconds\n\
    }\n```\n\n**RFQ Cancelled** (sent to taker only)\n```\n{\n  \"e\": \"rfqCancelled\",           // Event type\n  \"E\"\
    : 1730225460369829,         // Event time in microseconds\n  \"R\": 113392053149171712,       // RFQ ID\n  \"C\": \"123\"\
    ,                    // Client RFQ ID\n  \"s\": \"SOL_USDC_RFQ\",           // Symbol\n  \"S\": \"Bid\",             \
    \       // RFQ side\n  \"Q\": \"150\",                    // Quote quantity (optional) (if quantity in quote asset)\n\
    \  \"w\": 1730225480368,            // Submission time in milliseconds\n  \"W\": 1730225540368,            // Expiry time\
    \ in milliseconds\n  \"X\": \"Cancelled\",              // RFQ status\n  \"T\": 1730225460368765          // Engine timestamp\
    \ in microseconds\n}\n```\n\n**Quote Accepted** (sent to quoter)\n```\n{\n  \"e\": \"quoteAccepted\",          // Event\
    \ type\n  \"E\": 1730225434631394,         // Event time in microseconds\n  \"R\": 113392053149171712,       // RFQ ID\n\
    \  \"u\": 113392054083780608,       // Quote ID\n  \"C\": \"123\",                    // Client Quote ID\n  \"s\": \"\
    SOL_USDC_RFQ\",           // Symbol\n  \"X\": \"New\",                    // Quote status\n  \"T\": 1730225434629778 \
    \         // Engine timestamp in microseconds\n}\n```\n\n**Quote Cancelled** (sent to quoter)\n```\n{\n  \"e\": \"quoteCancelled\"\
    ,         // Event type\n  \"E\": 1730225583761963,         // Event time in microseconds\n  \"R\": 113392061354344448,\
    \       // RFQ ID\n  \"u\": 113392062870847488,       // Quote ID\n  \"C\": \"123\",                    // Client Quote\
    \ ID\n  \"s\": \"SOL_USDC_RFQ

# --- truncated at 32 KB (386 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/backpack/refs/heads/main/openapi/backpack-exchange-openapi.yml