> ## Documentation Index
> Fetch the complete documentation index at: https://docs.backquant.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Flow by strike

> Cumulative multi-venue aggressor buying and selling by strike on still-open contracts, split into call buy, call sell, put buy and put sell.

`GET /v2/tape/flow-by-strike`

Real taker flow on **still-open** contracts (`expiry_date >= today UTC`),
aggregated by strike into four quadrants: call buy, call sell, put buy,
put sell. This is **cumulative inventory of aggressor prints behind live
OI**, not a rolling lookback window.

Use it to see where aggressors have been active by strike without pulling
the full trade history.

## Who it's for

| You need…                                    | Use                                                                        |
| -------------------------------------------- | -------------------------------------------------------------------------- |
| Per-strike sold vs bought (calls and puts)   | **This endpoint**                                                          |
| Time-bucket buy/sell imbalance               | [`/v2/tape/imbalance`](/api/v2/tape/imbalance)                             |
| Ranked net premium by strike over a lookback | [`/v2/tape/strike-heat`](/api/v2/tape/strike-heat)                         |
| Raw trades                                   | [`/v2/tape`](/api/v2/tape/tape) / [`/v2/tape/recent`](/api/v2/tape/recent) |

## Coins

`BTCUSDT` and `ETHUSDT` only. `SOLUSDT` / `HYPEUSDT` return `404` - they
do not yet have a multi-venue aggressor tape of this shape.

## Query parameters

| Param             | Type                | Default  | Description                                                                              |
| ----------------- | ------------------- | -------- | ---------------------------------------------------------------------------------------- |
| `symbol`          | string              | required | `BTCUSDT` or `ETHUSDT`                                                                   |
| `expiry`          | `YYYY-MM-DD`        | all open | Restrict to one live expiry                                                              |
| `expiries`        | CSV of `YYYY-MM-DD` | -        | Combine several live expiries; **takes precedence** over `expiry`                        |
| `venues`          | CSV                 | all      | Filter: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta` |
| `min_premium_usd` | number ≥ 0          | `0`      | Drop prints below this USD premium (whale floor)                                         |

Omit both `expiry` and `expiries` to include every still-open contract.

## Response shape

```json theme={null}
{
  "success": true,
  "data": {
    "coin": "BTC",
    "expiry": null,
    "expiries": null,
    "available_expiries": ["2026-08-18", "2026-08-19", "2026-08-21"],
    "available_venues": [
      "binance", "bybit", "delta", "delta_india",
      "deribit", "derive", "okx", "thalex"
    ],
    "spot_price": 63426.5,
    "strikes": [
      {
        "strike": 63000,
        "call_buy":  { "premium": 120450.2, "size": 12.4, "trades": 38 },
        "call_sell": { "premium": 98010.0,  "size": 9.1,  "trades": 22 },
        "put_buy":   { "premium": 210300.5, "size": 18.2, "trades": 55 },
        "put_sell":  { "premium": 175200.0, "size": 15.0, "trades": 41 }
      }
    ],
    "totals": {
      "call_buy":  ...,
      "call_sell": ...,
      "put_buy":   ...,
      "put_sell":  ...
    },
    "block_trades": 17,
    "ts": "2026-08-18T02:15:00+00:00"
  },
  "meta": { "...": "..." }
}
```

### Quadrant fields

Each of `call_buy` / `call_sell` / `put_buy` / `put_sell`:

| Field     | Unit                | Meaning                                        |
| --------- | ------------------- | ---------------------------------------------- |
| `premium` | USD                 | Sum of `premium_usd` on matching prints        |
| `size`    | **Coin-equivalent** | Sum of tape `amount` (not raw venue contracts) |
| `trades`  | count               | Number of prints                               |

Dealer-style net size on a call strike is typically
`call_sell.size − call_buy.size` (passive/maker inventory from aggressor
tape). See [Positioning](/concepts/positioning).

## Important properties

* **Cumulative on open contracts** - not “last N hours.” Expired prints
  drop when `expiry_date` rolls past UTC today.
* **Native taker side** - every venue stamps `direction` at ingest
  (Deribit, Bybit, OKX, Binance, Derive, Thalex, Delta India, Delta Global).
  This is not quote-rule inference.
* **Cached \~90s** - single-flight compute; safe to poll for dashboards.

## Example

```bash theme={null}
curl "https://api.backquant.com/v2/tape/flow-by-strike?symbol=BTCUSDT&expiry=2026-08-18" \
  -H "X-API-Key: $BQ_API_KEY"
```

```bash theme={null}
# Whale floor + venue filter
curl "https://api.backquant.com/v2/tape/flow-by-strike?symbol=BTCUSDT&min_premium_usd=25000&venues=deribit,bybit,delta_india" \
  -H "X-API-Key: $BQ_API_KEY"
```

## See also

<CardGroup cols={2}>
  <Card title="Positioning (flow vs std)" href="/concepts/positioning" icon="scale-balanced" />

  <Card title="Venue coverage" href="/concepts/venues" icon="building" />

  <Card title="Tape overview" href="/api/v2/tape/overview" icon="table-list" />

  <Card title="Greek TRACE" href="/api/v2/options/greeks/trace" icon="chart-area" />
</CardGroup>


## OpenAPI

````yaml GET /tape/flow-by-strike
openapi: 3.1.0
info:
  title: BackQuant API v2
  description: >-

    # BackQuant API v2


    Options + gamma-exposure focused public API. Built on the same data the

    BackQuant Pro Terminal renders - pre-computed every 30s, served from cache.


    ## What's in v2


    * **Discovery**: `/v2/symbols` (universe + per-symbol freshness + supported
      endpoint list), `/v2/expiries` (active expiry tokens with DTE), `/v2/status`
      (per-symbol-per-category health with thresholds + overall classification).
    * **GEX**: composable levels (HVL / call wall / put support / max-pain /
      expected move / gamma-flip zones), strike profile with typed expiry
      filter, expiry profile, strike × expiry heatmap with downsampling,
      greek time-heatmap with DTE/OI/IV filters, history (cursor-paginated),
      Postgres-backed stress history, **per-expiry max-pain with pain curve**.
    * **Options**: filtered options chain with two-layer projection (top-level
      `?fields=` and per-contract `?include=oi,iv,greeks,bid_ask,volume,gex`)
      plus moneyness filter (`?moneyness_min=0.9&moneyness_max=1.1`), expiry
      summary table, full IV suite (surface / term structure / 25Δ-10Δ skew /
      curves / **single-expiry smile** / IV-RV history / VRP), expected move,
      **Breeden-Litzenberger probability density and surface**, typed greek
      profiles (delta / theta / vanna / charm / vega), strike × time charm/vega
      surfaces, strike × expiry 3D greek surface, OI by expiry + history,
      put/call ratio (intraday or daily), 0DTE & weekly premium tide,
      dated-futures term structure.
    * **Liquidation**: heatmap + leverage-tiered distribution.

    * **Multi**: `/v2/multi/gex/levels` - bundled multi-symbol read across the
      universe in one round-trip, with the same `?include=` model as the
      single-symbol endpoint.

    ## Authentication


    Every v2 route (except `/v2/openapi.json`, `/v2/docs`, `/v2/redoc`, and

    `/v2/health`) requires the `X-API-Key` header.


    ```

    X-API-Key: bq_live_your_api_key_here

    ```


    **Get your API key at
    [backquant.com/api-access](https://backquant.com/api-access).**


    The same key works across v1 and v2 - if you already have a v1 key, no

    re-issuance is needed.


    ## Rate limits


    Two budgets, both derived from your subscription tier: a **monthly request

    allowance** per account, and a **per-minute burst** per key. Size your

    integration against the monthly figure - sustained polling at the burst rate

    exhausts the month early.


    | Plan                      | Monthly allowance | Burst    | Sustained   |

    |---------------------------|-------------------|----------|-------------|

    | Starter (Terminal Yearly) | 10,000 req/month  | 10/min   | ~333/day    |

    | Standard (Crypto API)     | 250,000 req/month | 60/min   | ~8,300/day  |

    | Pro (Terminal + API)      | 1,000,000/month   | 120/min  | ~33,000/day |

    | Enterprise                | custom            | 600/min  | custom      |


    Headers `X-RateLimit-Limit / -Remaining / -Reset` (burst) and

    `X-Quota-Limit / -Used / -Remaining / -Period` (monthly) are included in

    every response; the rate-limit triple is echoed inside `meta.rate_limit`

    when populated by middleware. Exceeding either budget returns `429`.


    The live ladder is served at `GET /v2/meta` under `rate_limits`.


    ## Response envelope


    ```json

    {
      "success": true,
      "data": { ... },
      "meta": {
        "version": "2.0",
        "timestamp": "2026-04-29T12:00:00.000Z",
        "request_id": "req_…",
        "symbol": "BTCUSDT",
        "spot_price": 67213.5,
        "computed_at": "2026-04-29T11:59:48.000Z",
        "freshness_seconds": 12.0,
        "source": ["deribit","bybit","okx","binance","derive","thalex","delta_india","delta"],
        "exchanges_filtered": ["deribit","bybit"]
      }
    }

    ```


    ## Errors


    ```json

    {
      "success": false,
      "error": {
        "code": "NOT_FOUND",
        "message": "No data for BTCUSDT"
      },
      "meta": { "version": "2.0", "timestamp": "..." }
    }

    ```


    | Code                  | When |

    |-----------------------|------|

    | `UNAUTHORIZED`        | Missing or invalid API key |

    | `FORBIDDEN`           | Subscription doesn't allow API access |

    | `NOT_FOUND`           | Symbol/expiry/etc. not present in cache |

    | `VALIDATION_ERROR`    | Bad query parameters |

    | `RATE_LIMIT_EXCEEDED` | Per-tier limit hit |

    | `UPSTREAM_ERROR`      | Cache or DB temporarily unreachable |

    | `INTERNAL_ERROR`      | Anything else |
        
  version: '2.6'
servers: []
security: []
tags:
  - name: Meta
    description: Unauthenticated metadata + endpoint catalog (planning your integration)
  - name: Discovery
    description: Symbol catalog, active expiries, and service status
  - name: GEX
    description: Gamma exposure analytics
  - name: Options
    description: Options chain, IV, greeks, probability, premium tide
  - name: Liquidation
    description: Liquidation heatmap and distribution
  - name: Multi
    description: Bundled multi-symbol endpoints (single round-trip across the universe)
paths:
  /tape/flow-by-strike:
    get:
      tags:
        - Tape
      summary: Aggressor flow by strike (bought vs sold calls/puts)
      description: >-
        REAL multi-venue taker flow on still-open contracts (`expiry_date >=
        today UTC`) - cumulative sold/bought pressure behind live open interest,
        not a rolling lookback.


        Four quadrants per strike: `call_buy`, `call_sell`, `put_buy`,
        `put_sell` - each with `premium` (USD), `size` (contracts/coin-eq), and
        `trades` count. Every venue stamps native taker `direction` at ingest
        (Deribit/Bybit/OKX/Binance/Derive/Thalex), so this is exact aggressor
        side, not quote-rule inference.


        Use `expiry` or `expiries` (YYYY-MM-DD) to restrict to one or more live
        expiries. Omit both for all open contracts. Optional `venues` CSV and
        `min_premium_usd` whale filter.


        Response shape matches the terminal / internal crypto flow endpoint so
        integrators can rebuild TRACE-style dealer maps.
      operationId: get_tape_flow_by_strike_tape_flow_by_strike_get
      parameters:
        - name: symbol
          in: query
          required: false
          schema:
            enum:
              - BTCUSDT
              - ETHUSDT
              - SOLUSDT
              - HYPEUSDT
            type: string
            description: 'Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.'
            default: BTCUSDT
            title: Symbol
          description: 'Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.'
        - name: expiry
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: Single live expiry YYYY-MM-DD. Omit for all open contracts.
            title: Expiry
          description: Single live expiry YYYY-MM-DD. Omit for all open contracts.
        - name: expiries
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Comma-separated live expiries YYYY-MM-DD to COMBINE; takes
              precedence over `expiry`.
            title: Expiries
          description: >-
            Comma-separated live expiries YYYY-MM-DD to COMBINE; takes
            precedence over `expiry`.
        - name: min_premium_usd
          in: query
          required: false
          schema:
            type: number
            minimum: 0
            description: Minimum premium_usd per trade (whale filter).
            default: 0
            title: Min Premium Usd
          description: Minimum premium_usd per trade (whale filter).
        - name: venues
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              CSV venue filter. Default: all. Allowed: binance, bybit, delta,
              delta_india, deribit, derive, okx, thalex
            title: Venues
          description: >-
            CSV venue filter. Default: all. Allowed: binance, bybit, delta,
            delta_india, deribit, derive, okx, thalex
        - name: X-API-Key
          in: header
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: X-Api-Key
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '401':
          description: Invalid or missing API key
          content:
            application/json:
              example:
                success: false
                error:
                  code: UNAUTHORIZED
                  message: Invalid API key
                meta:
                  version: '2.0'
                  timestamp: '2026-04-29T12:00:00Z'
        '404':
          description: No data available for the requested resource
          content:
            application/json:
              example:
                success: false
                error:
                  code: NOT_FOUND
                  message: No data for BTCUSDT
                meta:
                  version: '2.0'
                  timestamp: '2026-04-29T12:00:00Z'
        '422':
          description: Validation error on query parameters
          content:
            application/json:
              example:
                success: false
                error:
                  code: VALIDATION_ERROR
                  message: Invalid request parameters
                  details:
                    errors: []
                meta:
                  version: '2.0'
                  timestamp: '2026-04-29T12:00:00Z'
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              example:
                success: false
                error:
                  code: RATE_LIMIT_EXCEEDED
                  message: Rate limit exceeded. Try again later.
                meta:
                  version: '2.0'
                  timestamp: '2026-04-29T12:00:00Z'
      security:
        - ApiKeyAuth: []
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: Your BackQuant API key (same key as v1)

````