Skip to main content
Ironflow’s feed comes directly from the venue — the same events validators process. We do as little as possible to the data before it reaches your query window, and we’re explicit about every normalization choice so you can rebuild any view you need from raw fills. This page documents the per-event-type choices. Continuous cross-checks against external sources are documented in Reliability.

Schema at a glance

Each market is keyed by a stable identity, not a display string: The display_symbol is what API responses expose as market. Cross-issuer queries use base_market (the suffix-only form, e.g. GAS-PERP) and issuer independently — see Sources & Markets.

Candles / OHLCV

What we store. Every fill — including liquidation fills and internal/cross-book trades — contributes to the candle. We don’t pre-filter the tape. Why. Filtering for display is a one-line WHERE clause; recovering filtered data after the fact is impossible. We default to the more literal capture.

Funding rates

What we store. Every funding-rate emission from the venue, written by a single dedicated process to keep the table free of write conflicts. Cadence. Hourly on Hyperliquid; some HIP-3 builder markets emit on different schedules. Continuity is monitored per market.

HIP-3 builder markets

HIP-3 markets are namespaced as <issuer>:<base>-PERP (e.g. flx:GAS-PERP). Three filter modes work identically across every endpoint:
See Sources & Markets for the full filter scheme.

Spot pairs

HL spot is queryable by either form:
Spot has no funding, no liquidations, and no market_class='perp'. Filter by market_class = 'spot' to scope queries.

At-least-once delivery

The pipeline is at-least-once end-to-end: every event is delivered to ClickHouse at least once, and duplicates are collapsed in the storage layer. A retried recovery on the same window is a no-op — you can’t double-count, and you can’t accidentally miss a row. See Reliability for how the gap detection, recovery, and audit layers fit together.