---
title: "Market-wide breadth, advance/decline, and sector rotation"
method: GET
path: "/v1/flow/market-breadth"
tags: ["Market"]
---

# Market-wide breadth, advance/decline, and sector rotation

`GET /v1/flow/market-breadth`

Combines SPY/QQQ/IWM aggregate sentiment with an advance/decline
ratio (over directional FIR) and per-sector rotation signals. Ideal
as a single "is the market risk-on or risk-off right now" probe.

## Query parameters

- `date` string, date
- `fir_threshold` number, double

## Response `200`

Market breadth + advance/decline + sector rotation.

- MarketBreadthSuccess
  - `data` MarketBreadthResponse, required
    - `date` string, date, required
    - `majorIndices` IndexSentiment[], required
      - `ticker` string, required
      - `bullishPremium` number, required
      - `bearishPremium` number, required
      - `netPremium` number, required
      - `fir` number, required
      - `sentiment` 'strong_bullish' | 'bullish' | 'slightly_bullish' | 'neutral' | 'slightly_bearish' | 'bearish' | 'strong_bearish', required
    - `aggregateSentiment` AggregateSentiment, required
      - `combinedBullish` number, required
      - `combinedBearish` number, required
      - `combinedNetPremium` number, required
      - `combinedFir` number, required
      - `sentiment` 'strong_bullish' | 'bullish' | 'slightly_bullish' | 'neutral' | 'slightly_bearish' | 'bearish' | 'strong_bearish', required
    - `advanceDecline` AdvanceDecline, required
      - `advancing` integer, required
      - `declining` integer, required
      - `unchanged` integer, required
      - `total` integer, required
      - `ratio` number, required — Advancing / declining (capped). 0.0 means no decliners.
      - `breadthPct` number, required — Share (0–100) of tickers classified as advancing.
      - `marketAvgFir` number, required — Mean FIR across all tickers (-100..+100).
    - `sectorRotation` SectorRotation[], required
      - `sector` string, required
      - `etf` string, required
      - `fir` number, required
      - `netPremium` number, required
      - `signal` 'strong_inflow' | 'inflow' | 'neutral' | 'outflow' | 'strong_outflow', required
  - `meta` Meta, required
    - `timestamp` string, date-time, required — Server-side timestamp the response was generated at.
    - `requestId` string, required — Short opaque ID for log correlation.

## Other responses

- `400` — Request validation failed.
- `401` — Missing or invalid API key.
- `402` — The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`.
- `403` — API key revoked/expired, monthly quota exceeded, or the account's API access is suspended (`account_suspended`).
- `429` — Per-minute rate limit exceeded.
- `503` — Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry.

---

[API](https://skmtc.net/skylit/apis/flowseeker-skylit-public-api.md) · [All operations](https://skmtc.net/skylit/apis/flowseeker-skylit-public-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/skylit/flowseeker-skylit-public-api/revisions/3280190b1b24/schema)
