GET/v1/flow
Get options flow trades
Returns recent options flow trade prints (large trades, filtered by premium). Limit defaults to 50 (max 500); minPremium defaults to 10000. Default sort order is premium descending; pass sort=time for timestamp descending. A market-wide query (without symbol) spanning more than 3 weekday trading sessions returns 400 out_of_range (FlowMaxMarketWideSessions = 3); split wide queries across multiple requests or narrow with symbols. Database query timeouts return 503 query_timeout with a Retry-After header.
Endpoint Usage & Plan Rules
Plan Access
Included in Basic
Active subscription
Result Clamping
Clamped by Plan
Clamped to plan max_rows
Parameters
Optional Parameters
| Name | Type | Location | Description |
|---|---|---|---|
| symbol | string | query | Underlying equity ticker symbol (alias: ticker). |
| symbols | string | query | Comma-separated list of symbols (alias: tickers, max 20). Exceeding 20 returns 400 invalid_parameter. |
| sentiment | string | query | Filter by derived trade sentiment ('bullish', 'bearish', or 'neutral'). Neutral includes prints with no sentiment tags. |
| side | string | query | Filter by execution fill side relative to prevailing bid/ask ('ask', 'bid', or 'mid'). |
| type | string | query | Filter by option contract type ('call' or 'put', alias: optionType). |
| executionType | string | query | Filter by trade routing structure ('sweep', 'block', or 'split', alias: execution). |
| minPremium | number | query | Minimum trade premium in dollars (defaults to $10,000 for large prints; keeps per-symbol queries fast; explicit values below 10000 remain supported). |
| limit | integer | query | Number of flow records to return (1 to 500, default 50; values > 500 are clamped to 500 and plan max_rows). |
| sort | string | query | Sort order of returned trade prints ('premium' for premium descending, 'time' for executedAt descending; defaults to 'premium'). |
| from | string | query | Window start date in YYYY-MM-DD format (alias: fromDate). Older than 7 days returns 400 out_of_range. Clamped to plan history_days. When omitted, the window starts at `to` (a `to` alone is one session; a `to` past the newest session means the newest session) or, with neither, the newest session. |
| to | string | query | Window end date in YYYY-MM-DD format (alias: toDate). When omitted: with symbol(s), the newest session; market-wide (no symbols), the `from` session, so a `from` alone is one session; with neither `from` nor `to`, the newest session. |
Request Examples
curl -s -H "Authorization: Bearer $WSO_API_KEY" \
"https://api.wheelstrategyoptions.com/v1/flow?symbol=AAPL&limit=50"Try it
GET/v1/flow
Included in BasicAdd your API key to send.
Response
Send a request to see the live response, its status, timing, and rate-limit headers.
Response Attributes (200 OK)
| Field | Type | Nullable | Description |
|---|---|---|---|
| asOf | string | No | Feed timestamp of the newest trade in the entire feed (flow.go:219-230). |
| retentionDays | integer | No | Flow retention horizon in days (fixed at 7). |
| fromDate | string | No | Window start date in YYYY-MM-DD format. |
| toDate | string | No | Window end date in YYYY-MM-DD format. |
| count | integer | No | Total matches in the window before limit, capped at 10,000. |
| countCapped | boolean | No | True when the total matches in the window reached 10,000. |
| prints | object[] | No | List of executed flow prints. |
Response Example
json
{
"asOf": "2026-10-09T19:34:09.078Z",
"retentionDays": 7,
"fromDate": "2026-10-09",
"toDate": "2026-10-09",
"count": 10000,
"countCapped": true,
"prints": [
{
"executedAt": "2026-10-09T18:01:18.053Z",
"ticker": "AAPL",
"optionSymbol": "",
"optionType": "put",
"strike": 330,
"expiration": "2026-11-27",
"dte": 49,
"side": "ask",
"sentiment": "bearish",
"executionType": "split",
"premium": 5158800,
"size": 5732,
"price": 9,
"underlyingPrice": 335.39,
"otmPct": 1.607084289931125,
"volume": 9988,
"openInterest": 16,
"opening": true,
"delta": -0.3894177072387585,
"impliedVolatility": 25.31,
"isETFOrIndex": false
},
{
"executedAt": "2026-10-09T17:51:55.467Z",
"ticker": "AAPL",
"optionSymbol": "",
"optionType": "call",
"strike": 350,
"expiration": "2026-11-20",
"dte": 42,
"side": "unknown",
"sentiment": "neutral",
"executionType": "block",
"premium": 2968875,
"size": 5075,
"price": 5.85,
"underlyingPrice": 334.945,
"otmPct": 4.494767797698129,
"volume": 6381,
"openInterest": 17591,
"opening": false,
"delta": 0.3332500957498555,
"impliedVolatility": 24.47,
"isETFOrIndex": false
},
{
"executedAt": "2026-10-09T15:13:17.145Z",
"ticker": "AAPL",
"optionSymbol": "",
"optionType": "call",
"strike": 125,
"expiration": "2029-01-19",
"dte": 833,
"side": "ask",
"sentiment": "bullish",
"executionType": "split",
"premium": 1665150,
"size": 75,
"price": 222.02,
"underlyingPrice": 334.24,
"otmPct": -62.601723312589755,
"volume": 99,
"openInterest": 48,
"opening": true,
"delta": 0.97882120744085,
"impliedVolatility": 42.25,
"isETFOrIndex": false
}
]
}Error Responses
| Status | Description |
|---|---|
| 400 | Bad Request. The request body, query parameters, or path values violated validation constraints. |
| 401 | Unauthorized. Missing, malformed, or invalid API key credential. |
| 403 | Forbidden. Rejection reasons: `subscription_required`, `subscription_inactive`, `trial_ended`, `plan_upgrade_required` (with `required_plan`), `wrong_credential_type`, `origin_forbidden` (origin authentication failed). |
| 404 | Not Found. Requested resource, ticker symbol, or option contract does not exist. |
| 405 | Method Not Allowed. Returned with an `Allow` header when an unsupported HTTP method is used. Error code: `method_not_allowed`. (HEAD is served on all GET routes and counts against the rate limit like GET.) |
| 429 | Too Many Requests. Rejection reasons: `rate_limited` (per-minute limit), `too_many_concurrent_requests` (in-flight cap), `too_many_auth_failures`. |
| 500 | Internal Server Error. Unhandled internal server or database error. |
| 503 | Service Unavailable. Backing database, cache, or external provider connection unavailable. |