---
title: "Top prints of the day"
method: GET
path: "/options-flow/top"
tags: ["Unusual Activity"]
---

# Top prints of the day

`GET /options-flow/top`

## Request

- Base URL: `https://optionsbell.com/api/v1`
- URL: `https://optionsbell.com/api/v1/options-flow/top`
- Auth: API key in header `X-API-Key`

The day's biggest bets, ranked by `premium_estimate` descending
(`rank` is the 1-based position) - the view that also powers the
alert emails. A thin, ranked cut over the same contract-level data as
`/options-flow/unusual`, without the base floor: only `min_premium`
applies.

Not a fixed global top-N: every print that passes the filters is
reachable through `limit` + `offset`. `symbols`, `type` and
`min_premium` are applied before ranking, `rank` is the position in
the full filtered set and keeps counting across pages. Ordered by
`premium_estimate` desc, then `symbol`, `option_symbol`, so paging
is deterministic; a finished day is immutable and repeatable.

## Query parameters

- `date` string, date
- `type` 'c' | 'p' | 'all' | 'call' | 'calls' | 'put' | 'puts'
- `symbols` string
- `min_premium` number
- `limit` integer
- `offset` integer

## Response `200`

Ranked top prints

- object
  - `date` string, date, nullable, required
  - `type` 'call' | 'put' | 'all', required: Normalized side filter.
  - `min_premium` number, required
  - `count` integer, required
  - `limit` integer, required
  - `offset` integer, required
  - `filtered_total` integer, required: Rows matching the filters across all pages (0 when the page is past the end).
  - `has_more` boolean, required
  - `data` TopPrint[], required
    - `rank` integer: 1-based position by premium_estimate.
    - `symbol` string
    - `option_symbol` string
    - `symbol_type` 'Call' | 'Put'
    - `base_last_price` string: Numeric string.
    - `strike_price` string: Numeric string.
    - `expiration_date` string: Expiration date as stored by the data source (MM/DD/YY).
    - `days_to_expiration` integer: Calendar days from data_date to expiration_date, computed by the API (not trading days, no holiday adjustment). Authoritative for max_dte and the /expiry buckets.
    - `last_price` string: Numeric string.
    - `volume` string: Numeric string.
    - `open_interest` string: Numeric string.
    - `volume_oi_ratio` string: Numeric string.
    - `volatility` string: Numeric string. IV in percent.
    - `delta` string: Numeric string.
    - `date` string, date
    - `sector` string, nullable
    - `industry` string, nullable
    - `premium_estimate` string: Numeric string. USD.

## Other responses

- `400`: Invalid input: `INVALID_DATE`, `INVALID_PARAM`, `INVALID_SYMBOLS`.
- `401`: Missing or invalid API key: `MISSING_API_KEY`, `INVALID_API_KEY_FORMAT`, `INVALID_API_KEY`. No rate-limit headers.
- `403`: Key is valid but has no usable subscription: `NO_ACTIVE_SUBSCRIPTION` (no Personal plan on the key) or `SUBSCRIPTION_INACTIVE` (past due, paused, expired, or canceled past its period end). No rate-limit headers.
- `429`: Rate limit exceeded: `RATE_LIMIT_MINUTE` (60/min) or `RATE_LIMIT_DAY` (4,000/day). Carries both rate-limit header sets and `Retry-After` (seconds until the exhausted window opens again). Rejected requests count against the minute window, so back off instead of retrying immediately.
- `500`: Unexpected server error: `INTERNAL_ERROR`. The body and the X-Request-Id header carry the request id.
- `503`: Authentication backend unreachable: `AUTH_UNAVAILABLE`. Retry later. No rate-limit headers.

---

[API](https://skmtc.dev/optionsbell/apis/optionsbell-options-flow-api.md) · [All operations](https://skmtc.dev/optionsbell/apis/optionsbell-options-flow-api/llms.txt) · [OpenAPI document](https://skmtc.dev/optionsbell/apis/optionsbell-options-flow-api/revisions/42db9bcaa61f?raw)
