Helious Boards API

The FX momentum, implied volatility, correlation and Hormuz boards: newest reading plus history.

GitHub OpenAPI

Operations 19

GET /v1/nasdaq100 The NASDAQ-100, ranked best to worst on the session #
GET /v1/fx FX momentum board: newest reading and history #
GET /api/seo/fx FX momentum sample (JSON) #
GET /api/seo/fx.csv FX momentum sample (CSV) #
GET /v1/vol Implied volatility board: newest reading and history #
GET /api/seo/vol Implied volatility sample (JSON) #
GET /api/seo/vol.csv Implied volatility sample (CSV) #
GET /v1/correlations Cross-asset correlation matrix: newest reading and history #
GET /v1/imbalance Helious market imbalance: market-on-open and market-on-close reads #
GET /v1/imbalance/{symbol} One name's auction imbalance prints in one session #
GET /v1/score The Helious momentum score: newest reading and history #
GET /api/seo/corr Cross-asset correlations sample (JSON) #
GET /api/seo/corr.csv Cross-asset correlations sample (CSV) #
GET /v1/hormuz Strait of Hormuz transits per day #
GET /api/seo/hormuz Strait of Hormuz transits sample (JSON) #
GET /api/seo/hormuz.csv Strait of Hormuz transits sample (CSV) #
GET /api/seo/hormuz-activity Strait of Hormuz live Gulf activity (JSON) #
GET /api/seo/hormuz-independent Strait of Hormuz independent transit comparison #
GET /api/seo/hormuz-activity.csv Strait of Hormuz live Gulf activity (CSV) #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/helious-io:helious-io-boards-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

helious-io-boards-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Helious Public Boards API
  version: '2026-11-06'
  summary: Real-time US economic releases, Treasury auction results, rates and market news from the Helious desk.
  description: 'Read-only surface of api.helious.io. Every dataset here is first-party: captured by the Helious desk the moment it prints, with methodology at https://helious.io/methodology. On /v1/feed and the stream the Helious news wire rides beside the desk''s own posts: a wire headline is marked kind: headline and scored like everything else. The /v1 endpoints are the versioned contract for agents, and every tier sees the same endpoints and the same response shapes: only the history window, the delay and the market-data axis change, so an integration built keyless survives every upgrade untouched. The ladder: Sample (no key, no account, $0) gets 1 day of history, news and prints 1 hour behind, no market prices at all (price endpoints answer with the upgrade steps instead of numbers) and 30 calls a minute and 50 credits a month, shared by everyone on your network address. Free (a key on a free helious.io account, $0) gets 7 days of history, news 1 hour behind, every price board 60 minutes behind, and 60 calls a minute and 100 credits a month of your own. ONE CREDIT WALLET pays for everything an account does: a data call on any /v1 endpoint or MCP tool is 1 credit, a typed Ask Helious question in the terminal is 10, and on Free, Squawk and Starter the query fresh=1 (fresh: true as an MCP tool argument) answers that one call live for 5 credits. /v1/me, /v1/access, the MCP handshake, get_access_info, list_series, every error and every refusal are free; a keyless market wall is free too. Every answer carries X-Credits-Charged and X-Credits-Remaining headers and the same two numbers in meta (credits_charged, credits_left), and an empty wallet is a 429 with code out_of_credits carrying credits_left, resets_on, next_step (one sentence to relay), the packs that top it up (500 for $9.99, 1,500 for $24.99, never expiring) and upgrade_url: two ways on, a pack or a plan, and the person who owns the key chooses. Not on Pro and need one call live? Add fresh=1 to that request (fresh: true in an MCP tool''s arguments) and it answers live for 5 credits. Each delayed stream snapshot takes one credit on Free and with no key; a paid plan''s stream takes none. Starter ($14.99/mo or $135/yr) gets 12 months of history, live news and prints, every price board 60 minutes behind (live for 5 credits a call with fresh=1), 1,500 credits a month, at 90 calls a minute. Pro ($39.99/mo or $360/yr) gets 24 months of history, 3,000 credits a month and everything live for 1 credit (yields, treasuries, commodities, equities, FX, volatility, correlations) at 120 calls a minute, the streaming WebSocket included. Ultimate ($99/mo or $891/yr) gets 10 years of history, everything live, no credit cap, commercial use and redistribution, 300 calls a minute and the live stream on 5 connections a key. The stream at wss://api.helious.io/v1/stream is open on every tier, key or no key: below Pro it runs the delayed lane (one snapshot a minute, prices and the ranked NASDAQ-100 board 60 minutes behind, news on the plan''s own delay), and Pro and Ultimate run the live lane (every price tick, print and NASDAQ-100 update pushed the moment it happens, on up to 2 connections a key on Pro and 5 on Ultimate), in identical message shapes, so a stream integration survives the upgrade untouched. Authenticate with the same hel_ key sent as the ''Authorization: Bearer hel_...'' header, never a query parameter; the socket sends a hello whose mode field names your lane, feed items in the /v1/feed shape, price ticks, the ranked NASDAQ-100 board, daily official closes and the Helious momentum score, and answers ''ping'' with pong. Keys are sent as ''Authorization: Bearer hel_...''; GET /v1/access returns the ladder and the exact upgrade steps in plain words. There is also an MCP server at https://api.helious.io/mcp: point any MCP client at that URL and the same data arrives as tools.'
  x-stream: 'wss://api.helious.io/v1/stream is the live WebSocket, which OpenAPI cannot describe as a path. One socket on every plan: live on Pro (2 connections a key) and Ultimate (5), delayed below Pro (one snapshot a minute). Messages: hello (mode names the lane), feed (items in the /v1/feed shape; a release print is kind post, category release, with the actual, forecast, previous and sigma in its text), prices, ndx, market_data, score (the Helious momentum score when it moves, in the /v1/score shape), and pong to a ping. The hel_ key goes in the Authorization: Bearer header, never a query parameter; no key opens the delayed lane. Documented at https://helious.io/developers/#stream and https://helious.io/developers/economic-calendar-api/#stream.'
  contact:
    name: Helious support
    email: support@helious.news
    url: https://helious.io/contact
  termsOfService: https://helious.news/terms
servers:
- url: https://api.helious.io
tags:
- name: Boards
  description: 'The FX momentum, implied volatility, correlation and Hormuz boards: newest reading plus history.'
paths:
  /v1/nasdaq100:
    get:
      tags:
      - Boards
      summary: The NASDAQ-100, ranked best to worst on the session
      description: Every NASDAQ-100 stock with price, change, sector and rank, sorted by the session's move. Live on Pro and Ultimate; Free, Squawk and Starter get the board 60 minutes behind for 1 credit and live for 5 with fresh=1; without a key the upgrade steps come instead of numbers. limit trims the list; the laggard rides along so the bottom of the board is visible even on a short slice. Pass symbol to ask about one company instead of the whole board.
      security:
      - {}
      - helious_key: []
      parameters:
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          default: 25
      - name: symbol
        in: query
        required: false
        schema:
          type: string
        description: One or more NASDAQ-100 tickers, comma separated, like AAPL. Returns that name's price, session move and rank on the board. Empty returns the whole ranked board.
      - $ref: '#/components/parameters/fresh'
      responses:
        '200':
          description: summary + source + data + meta envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Envelope'
        '429':
          description: 'Over the per-minute limit (code rate_limited, Retry-After the rest of the minute) or the wallet cannot pay (code out_of_credits: credits_left, resets_on, retry_after_seconds, packs, topup_url, upgrade_url, and fresh_costs on a held plan). Nothing is charged for a refusal.'
      operationId: getV1Nasdaq100
      x-operation-id-source: derived
  /v1/fx:
    get:
      tags:
      - Boards
      summary: 'FX momentum board: newest reading and history'
      description: Seven major currencies scored against the basket. current is the newest board; history is past boards back to since, within your plan's depth. Live on Pro and Ultimate; Free, Squawk and Starter get the board 60 minutes behind for 1 credit and live for 5 with fresh=1; without a key the upgrade steps come instead of numbers.
      security:
      - {}
      - helious_key: []
      parameters:
      - name: since
        in: query
        required: false
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          default: 60
      - $ref: '#/components/parameters/fresh'
      responses:
        '200':
          description: summary + source + data + meta envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Envelope'
        '429':
          description: 'Over the per-minute limit (code rate_limited, Retry-After the rest of the minute) or the wallet cannot pay (code out_of_credits: credits_left, resets_on, retry_after_seconds, packs, topup_url, upgrade_url, and fresh_costs on a held plan). Nothing is charged for a refusal.'
      operationId: getV1Fx
      x-operation-id-source: derived
  /api/seo/fx:
    get:
      tags:
      - Boards
      summary: FX momentum sample (JSON)
      description: 'The current seven-major currency-strength reading: each currency scored against the whole basket, with the 1-day and 5-day components and the exact tape window each was measured over. A keyless sample carrying the current reading only. The archive and the live feed come through /v1/fx, where depth follows your plan.'
      responses:
        '200':
          description: Board reading
          content:
            application/json:
              schema:
                type: object
      operationId: getApiSeoFx
      x-operation-id-source: derived
  /api/seo/fx.csv:
    get:
      tags:
      - Boards
      summary: FX momentum sample (CSV)
      description: 'Columns: currency, momentum_vs_basket_pct, d1_pct, d5_pct. Seven rows, one per basket currency, with a trailer line pointing to the API. A keyless sample carrying the current reading only. The archive and the live feed come through /v1/fx, where depth follows your plan.'
      responses:
        '200':
          description: CSV file
          content:
            text/csv:
              schema:
                type: string
      operationId: getApiSeoFxCsv
      x-operation-id-source: derived
  /v1/vol:
    get:
      tags:
      - Boards
      summary: 'Implied volatility board: newest reading and history'
      description: VIX and the other vol gauges with their one-year percentile. Same shape as /v1/fx. Live on Pro and Ultimate; Free, Squawk and Starter get the board 60 minutes behind for 1 credit and live for 5 with fresh=1; without a key the upgrade steps come instead of numbers.
      security:
      - {}
      - helious_key: []
      parameters:
      - name: since
        in: query
        required: false
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          default: 60
      - $ref: '#/components/parameters/fresh'
      responses:
        '200':
          description: summary + source + data + meta envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Envelope'
        '429':
          description: 'Over the per-minute limit (code rate_limited, Retry-After the rest of the minute) or the wallet cannot pay (code out_of_credits: credits_left, resets_on, retry_after_seconds, packs, topup_url, upgrade_url, and fresh_costs on a held plan). Nothing is charged for a refusal.'
      operationId: getV1Vol
      x-operation-id-source: derived
  /api/seo/vol:
    get:
      tags:
      - Boards
      summary: Implied volatility sample (JSON)
      description: 'The current implied-volatility board: level, session change, and trailing-year percentile with a calm/normal/elevated/stressed read for each gauge. Each row carries the session its own close came from, and `measured_through` is the newest across the board. A keyless sample carrying the current reading only. The archive and the live feed come through /v1/vol, where depth follows your plan.'
      responses:
        '200':
          description: Board reading
          content:
            application/json:
              schema:
                type: object
      operationId: getApiSeoVol
      x-operation-id-source: derived
  /api/seo/vol.csv:
    get:
      tags:
      - Boards
      summary: Implied volatility sample (CSV)
      description: 'Columns: gauge, measures, session, level, change, change_pct, percentile_1y, regime, low_1y, high_1y. One row per gauge, with a trailer line pointing to the API. A keyless sample carrying the current reading only. The archive and the live feed come through /v1/vol, where depth follows your plan.'
      responses:
        '200':
          description: CSV file
          content:
            text/csv:
              schema:
                type: string
      operationId: getApiSeoVolCsv
      x-operation-id-source: derived
  /v1/correlations:
    get:
      tags:
      - Boards
      summary: 'Cross-asset correlation matrix: newest reading and history'
      description: Stocks, bonds, the dollar, gold and oil over 30 to 120 day windows. Same shape as /v1/fx. Live on Pro and Ultimate; Free, Squawk and Starter get the board 60 minutes behind for 1 credit and live for 5 with fresh=1; without a key the upgrade steps come instead of numbers.
      security:
      - {}
      - helious_key: []
      parameters:
      - name: since
        in: query
        required: false
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          default: 60
      - $ref: '#/components/parameters/fresh'
      responses:
        '200':
          description: summary + source + data + meta envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Envelope'
        '429':
          description: 'Over the per-minute limit (code rate_limited, Retry-After the rest of the minute) or the wallet cannot pay (code out_of_credits: credits_left, resets_on, retry_after_seconds, packs, topup_url, upgrade_url, and fresh_costs on a held plan). Nothing is charged for a refusal.'
      operationId: getV1Correlations
      x-operation-id-source: derived
  /v1/imbalance:
    get:
      tags:
      - Boards
      summary: 'Helious market imbalance: market-on-open and market-on-close reads'
      description: Net dollar imbalance into the opening and closing auctions (shares not paired at the reference price, times the stock's previous close, buys less sells) over every NYSE listed company (nyse) and the S&P 500 names the feed carries (spx, coverage stated in the read), with the ten largest single names to buy and to sell, the paired volume and a plain-English read; `tiers` gives each basket's cut-offs in USD (below `small_below_usd` reads small, from `large_from_usd` large). Reads land at 9:28 and 9:29 ET for the open and 15:50, 15:55 and 15:58 ET for the close (three hours earlier for the close on a 1pm early close, none on an exchange holiday; `schedule` gives today's and the next session's moments in UTC); `open` and `close` carry the newest read of each, `reads` the ones behind them. Every read is stored, so `since` reaches back through the plan's history window. Helious calculates every figure itself from each listing's own auction print. Nasdaq-listed names are not on the feed. Live on Pro and Ultimate; Free, Squawk and Starter get each read the moment its auction prints (9:30 ET for the open, 4:00 PM ET for the close) for 1 credit and live for 5 with fresh=1; without a key the upgrade steps come instead of numbers.
      security:
      - {}
      - helious_key: []
      parameters:
      - name: since
        in: query
        required: false
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          default: 20
      - $ref: '#/components/parameters/fresh'
      responses:
        '200':
          description: summary + source + data + meta envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Envelope'
        '429':
          description: 'Over the per-minute limit (code rate_limited, Retry-After the rest of the minute) or the wallet cannot pay (code out_of_credits: credits_left, resets_on, retry_after_seconds, packs, topup_url, upgrade_url, and fresh_costs on a held plan). Nothing is charged for a refusal.'
      operationId: getV1Imbalance
      x-operation-id-source: derived
  /v1/imbalance/{symbol}:
    get:
      tags:
      - Boards
      summary: One name's auction imbalance prints in one session
      description: 'Every read of the open and the close for one symbol, newest first: side, shares, price (the previous close the print is marked at), dollars, paired shares and the exchange''s clearing price. The newest session by default; date=YYYY-MM-DD reads any stored session inside the plan''s history window. Covers every NYSE main-board listing, companies and the NYSE-listed ETFs; a Nasdaq or NYSE Arca listing (SPY, QQQ) answers on_feed=false. Same plan rules as /v1/imbalance: on Free, Squawk and Starter each read opens when its auction prints.'
      security:
      - {}
      - helious_key: []
      parameters:
      - name: symbol
        in: path
        required: true
        schema:
          type: string
        example: JPM
      - name: date
        in: query
        required: false
        description: An ET session date, YYYY-MM-DD. Empty reads the newest session.
        schema:
          type: string
        example: '2026-11-06'
      - $ref: '#/components/parameters/fresh'
      responses:
        '200':
          description: summary + source + data + meta envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Envelope'
        '429':
          description: 'Over the per-minute limit (code rate_limited, Retry-After the rest of the minute) or the wallet cannot pay (code out_of_credits: credits_left, resets_on, retry_after_seconds, packs, topup_url, upgrade_url, and fresh_costs on a held plan). Nothing is charged for a refusal.'
      operationId: getV1ImbalanceBySymbol
      x-operation-id-source: derived
  /v1/score:
    get:
      tags:
      - Boards
      summary: 'The Helious momentum score: newest reading and history'
      description: 'Helious''s own gauge of the session, bonds and equities each on a -10 to +10 scale (positive bullish for that asset, negative bearish), with a 0 to 100 strength and the desk''s signal label, plus the quarter-hour history. It is the momentum score the Helious terminal shows: a blend of the scored headlines and the live tape, recomputed as either moves, a reading of the desk and never a market fact or a forecast. Same shape as /v1/fx. Live on Pro and Ultimate; Free, Squawk and Starter get the reading 60 minutes behind for 1 credit and live for 5 with fresh=1; without a key the upgrade steps come instead of numbers. The stream pushes the same reading as {type:''score''} when it moves.'
      security:
      - {}
      - helious_key: []
      - helious_oauth:
        - market:read
      parameters:
      - name: since
        in: query
        required: false
        schema:
          type: string
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          default: 60
      - $ref: '#/components/parameters/fresh'
      responses:
        '200':
          description: summary + source + data + meta envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Envelope'
        '429':
          description: 'Over the per-minute limit (code rate_limited, Retry-After the rest of the minute) or the wallet cannot pay (code out_of_credits: credits_left, resets_on, retry_after_seconds, packs, topup_url, upgrade_url, and fresh_costs on a held plan). Nothing is charged for a refusal.'
      operationId: getV1Score
      x-operation-id-source: derived
  /api/seo/corr:
    get:
      tags:
      - Boards
      summary: Cross-asset correlations sample (JSON)
      description: 'The current correlation matrix over all four windows (30/60/90/120 days) with the notable pairs off the default window. Carries `proxy_note`: the high yield credit row is an ETF price, never a spread. A keyless sample carrying the current reading only. The archive and the live feed come through /v1/correlations, where depth follows your plan.'
      responses:
        '200':
          description: Board reading
          content:
            application/json:
              schema:
                type: object
      operationId: getApiSeoCorr
      x-operation-id-source: derived
  /api/seo/corr.csv:
    get:
      tags:
      - Boards
      summary: Cross-asset correlations sample (CSV)
      description: 'The default-window matrix as a square grid: columns are asset, window_days, measured_through, then one column per asset. A trailer line points to the API. A keyless sample carrying the current reading only. The archive and the live feed come through /v1/correlations, where depth follows your plan.'
      responses:
        '200':
          description: CSV file
          content:
            text/csv:
              schema:
                type: string
      operationId: getApiSeoCorrCsv
      x-operation-id-source: derived
  /v1/hormuz:
    get:
      tags:
      - Boards
      summary: Strait of Hormuz transits per day
      description: Ships through the strait per day, split tanker and cargo, measured by Helious from live ship tracking.
      security:
      - {}
      - helious_key: []
      parameters:
      - name: days
        in: query
        required: false
        schema:
          type: integer
          default: 60
      - $ref: '#/components/parameters/fresh'
      responses:
        '200':
          description: summary + source + data + meta envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Envelope'
        '429':
          description: 'Over the per-minute limit (code rate_limited, Retry-After the rest of the minute) or the wallet cannot pay (code out_of_credits: credits_left, resets_on, retry_after_seconds, packs, topup_url, upgrade_url, and fresh_costs on a held plan). Nothing is charged for a refusal.'
      operationId: getV1Hormuz
      x-operation-id-source: derived
  /api/seo/hormuz:
    get:
      tags:
      - Boards
      summary: Strait of Hormuz transits sample (JSON)
      description: 'The Strait of Hormuz daily transit dataset: the newest measured day with its tanker split, 7-day, 30-day and pre-crisis averages, a 30-day series and the desk read. The measured record publishes weekly, so the newest day runs a few days behind and carries `age_days`. A capped sample; the full history comes through /v1/hormuz, where depth follows your plan.'
      responses:
        '200':
          description: Board reading
          content:
            application/json:
              schema:
                type: object
      operationId: getApiSeoHormuz
      x-operation-id-source: derived
  /api/seo/hormuz.csv:
    get:
      tags:
      - Boards
      summary: Strait of Hormuz transits sample (CSV)
      description: 'Columns: date, total_transits, tankers, cargo, other. Recent days only, with a trailer line pointing to the API. The full history comes through /v1/hormuz, where depth follows your plan.'
      responses:
        '200':
          description: CSV file
          content:
            text/csv:
              schema:
                type: string
      operationId: getApiSeoHormuzCsv
      x-operation-id-source: derived
  /api/seo/hormuz-activity:
    get:
      tags:
      - Boards
      summary: Strait of Hormuz live Gulf activity (JSON)
      description: 'Hourly first-party history of live Gulf shipping activity beside the weekly transit count: vessels active on AIS, dark tankers (the measured size of the transit count''s AIS blind spot) and per-port congestion. NOT a transit count: these run roughly 85-270 hourly, while the Strait of Hormuz TRANSIT count is a different, much smaller quantity (roughly 1-8/day) served by /api/seo/hormuz. Never sum or compare the two. Aggregate the activity series with a median, never a mean: the upstream collection is tiled and undercounts one-sidedly when a tile fails. Each row carries the basis that produced it; never fit across a basis change. Query param `days` (1-90, default 14).'
      parameters:
      - name: days
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 90
          default: 14
      responses:
        '200':
          description: Hourly activity series with coverage stats
          content:
            application/json:
              schema:
                type: object
      operationId: getApiSeoHormuzActivity
      x-operation-id-source: derived
  /api/seo/hormuz-independent:
    get:
      tags:
      - Boards
      summary: Strait of Hormuz independent transit comparison
      description: 'Weekly transit totals from independent tracking, alongside this platform''s own total for the same calendar week and the ratio between them. The two measure different populations: the daily count at /api/seo/hormuz sees only vessels broadcasting AIS, while these totals include vessels crossing with transponders off. The daily count has run 2.0-3.1x lower week by week and the gap is widening. Compare them; never sum or average them, since a blend would be true of neither. `ours` is summed from the same calendar days as each independent week, and is null for any week not fully covered rather than reported as a misleading partial. Query param `weeks` (1-260, default 52).'
      parameters:
      - name: weeks
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 260
          default: 52
      responses:
        '200':
          description: Weekly independent totals with the ratio to this platform's own count
          content:
            application/json:
              schema:
                type: object
      operationId: getApiSeoHormuzIndependent
      x-operation-id-source: derived
  /api/seo/hormuz-activity.csv:
    get:
      tags:
      - Boards
      summary: Strait of Hormuz live Gulf activity (CSV)
      description: 'Columns: hour_utc, vessels_active, vessels_active_tanker, vessels_active_cargo, dark_tankers, dark_tankers_7d_baseline, congestion_outside_strait, congestion_inside_strait, basis. NOT a transit count: the Strait of Hormuz TRANSIT count is a different, much smaller quantity served by /api/seo/hormuz.csv. Never sum or compare the two. Query param `days` (1-90, default 14).'
      parameters:
      - name: days
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 90
          default: 14
      responses:
        '200':
          description: CSV file
          content:
            text/csv:
              schema:
                type: string
      operationId: getApiSeoHormuzActivityCsv
      x-operation-id-source: derived
components:
  parameters:
    fresh:
      name: fresh
      in: query
      required: false
      schema:
        type: boolean
      description: 'Not on Pro or Ultimate? Add fresh=1 to this request and this one call answers live (news, prints, auctions, boards and prices at the live instant) for 5 credits. Left out, Free, Squawk and Starter get the answer 60 minutes behind for 1 credit. With fewer than 5 credits left the live call is refused with out_of_credits and nothing is charged; the same call without the flag still answers for 1. Accepted and free on Pro and Ultimate, where the view is already live. Ignored without a key: a free account key has the flag. Over MCP the same flag is fresh: true in the tool''s arguments.'
  schemas:
    Envelope:
      type: object
      description: Every /v1 response. `summary` states the answer as one plain-English sentence and `source` says who to credit for it, both before the raw `data`, so the finished claim is the first thing a reader meets.
      properties:
        summary:
          type: string
          description: The answer as a sentence, with the numbers in it. Identical to the sentence the matching MCP tool returns.
        source:
          type: object
          description: Who to credit and where a reader can check the number.
          properties:
            name:
              type: string
              example: Helious
            url:
              type: string
              format: uri
              description: The Helious page backing this answer.
            cite_as:
              type: string
              example: Helious, https://helious.io/auctions
            attribution:
              type: string
            live:
              type: string
              description: How current these numbers are on YOUR plan, and how to ask for them again. Says the data is live only on a tier that serves it live.
        data:
          type: object
          description: The dataset itself.
        meta:
          type: object
          description: When it was true, and what your plan allows.
        plan_limit:
          type: object
          description: Present only when your plan moved the window AND Helious holds rows older than it. Says this is a plan limit rather than missing data, where the record begins (record_begins, on the lanes that say it), the plans that reach further, and the exact step to relay to the person you work for.
        record_start:
          type: object
          description: 'Present instead of plan_limit when you asked for more history than any plan reads here: record_begins is the first day any plan reads (null when there is none yet), your plan''s window already reaches it, older_rows_on_any_plan is false, and meta.clamped is false. No plan reaches further back, so there is nothing to upgrade for.'
  securitySchemes:
    helious_key:
      type: http
      scheme: bearer
      description: 'Your Helious API key, like hel_xxx, made on your helious.io account page (Account, then API keys). Every /v1 endpoint also works with no key at the sample tier: 1 day of history, news 1 hour behind, no market prices. A free account key gets 7 days and a rate budget of your own. Starter ($14.99/mo) takes the news live, reaches 12 months back and adds the Treasury curve 60 minutes behind; Pro ($39.99/mo) makes every price live with 24 months of history, the /v1/stream WebSocket included; Ultimate ($99/mo) reaches 10 years, allows commercial use and holds the live stream on 5 connections a key (Pro holds 2).'
    helious_oauth:
      type: oauth2
      description: Sign the person in instead of asking them for a key. Dynamic client registration is open, so your client can enrol itself; the one human step is the consent screen. Access tokens last an hour; ask for offline_access to get a rotating refresh token. Full details at https://helious.io/auth.md.
      flows:
        authorizationCode:
          authorizationUrl: https://helious.io/oauth/authorize
          tokenUrl: https://api.helious.io/oauth/token
          refreshUrl: https://api.helious.io/oauth/token
          scopes:
            market:read: Read Helious market data at that plan level.
            account:read: See which plan the account is on.
            openid: Confirm the account identity to your app.
            offline_access: Get a refresh token so you stay connected.