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).

Backpack Exchange WebSocket Streams API is one of 3 APIs that Backpack publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

Tagged areas include Crypto, Exchange, WebSocket, Streaming, and Market Data. The published artifact set on APIs.io includes API documentation and an OpenAPI specification.

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