{"components":{"responses":{"Error":{"content":{"application/json":{"schema":{"properties":{"error":{"properties":{"code":{"type":"string"},"message":{"type":"string"}},"type":"object"}},"type":"object"}}},"description":"Error"}}},"info":{"description":"Cardano DEX market data, served from confirmed-chain materializations. Amounts are base-unit integer strings with decimals adjacent; prices are numerator/denominator rationals plus a base-unit-scale value string. See /llms.txt for the vocabulary rules.","title":"Float API","version":"1.0.0-draft"},"openapi":"3.1.0","paths":{"/llms.txt":{"get":{"description":"Includes the vocabulary rules verbatim from API.md and the base-unit amount rule, prominently.","operationId":"llms_txt","parameters":[],"responses":{"200":{"content":{"text/plain":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"The point-an-AI-at-it entry point","tags":["meta"]}},"/v1":{"get":{"description":"The root case of the HATEOAS rule: agents explore by following links, never by constructing URLs.","operationId":"directory","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Directory: every resource, its href, and the API policies","tags":["meta"]}},"/v1/addresses/{address}/balances":{"get":{"description":"An interval fold over confirmed UTxOs: +amount at creation, -amount at spend, cumulative per asset. Amounts are base-unit integer strings; a zero balance is a real point, never an omission. meta.as_of is the fold's own watermark (it trails the stream tip by a few blocks by design).","operationId":"address_balances","parameters":[{"description":"Bech32 Shelley address (addr1…). The payment credential keys scope=payment; the stake credential keys scope=wallet.","in":"path","name":"address","required":true,"schema":{"type":"string"}},{"description":"Restrict to one asset: `ada.lovelace` or `<policyHex>.<assetNameHex>` (the separator-less concatenated form is accepted).","in":"query","name":"asset","required":false,"schema":{"type":"string"}},{"description":"Series resolution in the shared period grammar (1h is materialized today; the default), or `raw` for every point. Raw responses stop at 5000 rows and set meta.truncated: true.","in":"query","name":"period","required":false,"schema":{"enum":["1h","raw"],"type":"string"}},{"description":"Inclusive lower bound on bucket time (unix seconds).","in":"query","name":"from","required":false,"schema":{"type":"integer"}},{"description":"Inclusive upper bound on bucket time (unix seconds).","in":"query","name":"to","required":false,"schema":{"type":"integer"}},{"description":"Credential grouping: wallet (default when the address has a stake credential) groups every address sharing it; payment is the one payment credential, and the default for enterprise addresses, which declare no grouping.","in":"query","name":"scope","required":false,"schema":{"enum":["payment","wallet"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Balance series per asset from the UTxO interval fold","tags":["addresses"]}},"/v1/addresses/{address}/portfolio":{"get":{"description":"Every held asset gets exactly one row and exactly one kind: ada (the numeraire, exact 1/1 — it never appears in /v1/assets, so a naive balances×prices join would silently drop it), token (priced in the screener universe), redeemable (no direct price, but a base in the redemption graph — LP/qTokens; value: null with links.decomposition, never a fabricated price), nft (quantity 1, unpriced), unpriced (everything else), or custody (held for this address at a venue's script address, per a datum-declared owner — the row carries venue, underlying_kind and the claim's shape). Attribution is exclusive: a UTxO is counted through the address's own credential or through a custody claim, never both. A custody claim whose owner expression lets several parties withdraw alone (any_of, at_least) states its balance, carries shared_with_count, and stays out of the total. total_value_ada sums only the non-null values; unvalued_count says how many rows are excluded.","operationId":"address_portfolio","parameters":[{"description":"Bech32 Shelley address (addr1…). The payment credential keys scope=payment; the stake credential keys scope=wallet.","in":"path","name":"address","required":true,"schema":{"type":"string"}},{"description":"Credential grouping: wallet (default when the address has a stake credential) groups every address sharing it; payment is the one payment credential, and the default for enterprise addresses, which declare no grouping.","in":"query","name":"scope","required":false,"schema":{"enum":["payment","wallet"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Current balances × prices × metadata, joined server-side","tags":["addresses"]}},"/v1/addresses/{address}/transitions":{"get":{"description":"What each transaction changed about the address's holdings, netted per asset from the interval fold's provenance edges: a UTxO consumed and partly returned as change reports the real movement, not the gross legs. Signed base-unit integer strings. This is what separates unwrapping one layer of a composed position from leaving it — both lower a token's balance, but only the unwrap shows the redeemed asset arriving in the same transaction.","operationId":"address_transitions","parameters":[{"description":"Bech32 Shelley address (addr1…). The payment credential keys scope=payment; the stake credential keys scope=wallet.","in":"path","name":"address","required":true,"schema":{"type":"string"}},{"description":"Inclusive lower bound on bucket time (unix seconds).","in":"query","name":"from","required":false,"schema":{"type":"integer"}},{"description":"Inclusive upper bound on bucket time (unix seconds).","in":"query","name":"to","required":false,"schema":{"type":"integer"}},{"description":"Credential grouping: wallet (default when the address has a stake credential) groups every address sharing it; payment is the one payment credential, and the default for enterprise addresses, which declare no grouping.","in":"query","name":"scope","required":false,"schema":{"enum":["payment","wallet"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Per-transaction net asset movements for an address","tags":["addresses"]}},"/v1/assets":{"get":{"description":"Served from the prices materialization. Amounts are base-unit strings; decimals ride along per asset (null until the registry knows them).","operationId":"assets_list","parameters":[{"description":"Ranking key; descending. price_change.24h and holder_count are documented but not available yet.","in":"query","name":"sort","required":false,"schema":{"enum":["liquidity","volume","trade_count","pool_count"],"type":"string"}},{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}},{"description":"Opaque page cursor from links.next.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Page size, at most 5000 (default 100). The whole ranked list fits in one page: ask for it rather than walking links.next, which costs a round trip per page.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Comma-separated opt-in blocks. `display` adds parallel *_display strings (server-side decimal shift by the asset's decimals; no floats).","in":"query","name":"include","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Ranked asset list (the screener feed)","tags":["assets"]}},"/v1/assets/rowstats":{"get":{"description":"The screener's per-row 24h % / sparkline / 7d % for the whole ranked list, so a scrolled table makes one request instead of one per row. Each token uses the same deepest materialized pool as its candle endpoint; a token with no such pool is omitted. `closes` is the last 24 hourly closes (token-as-base); changes are fractions.","operationId":"assets_rowstats","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Screener row trend cells for every ranked token in one read","tags":["assets"]}},"/v1/assets/{asset}":{"get":{"description":"Blocks are provenance-tagged; the metadata block is registry facts (missing facts are null, never invented). profile/related/ratings blocks are not served yet.","operationId":"asset_detail","parameters":[{"description":"Asset id: `ada.lovelace` or `<policyHex>.<assetNameHex>`. The separator-less concatenated form is accepted on input; responses always use `.`.","in":"path","name":"asset","required":true,"schema":{"type":"string"}},{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}},{"description":"Comma-separated opt-in blocks. `display` adds parallel *_display strings (server-side decimal shift by the asset's decimals; no floats).","in":"query","name":"include","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"One asset: market data, registry metadata, and its markets","tags":["assets"]}},"/v1/assets/{asset}/candles":{"get":{"description":"Prices are value strings at base-unit scale; the response names the market the series came from.","operationId":"asset_candles","parameters":[{"description":"Asset id: `ada.lovelace` or `<policyHex>.<assetNameHex>`. The separator-less concatenated form is accepted on input; responses always use `.`.","in":"path","name":"asset","required":true,"schema":{"type":"string"}},{"description":"Candle interval in the shared period grammar. 1m and 1h are materialized today; defaults to 1h. Series are sparse — a bucket exists only for a period that had a trade.","in":"query","name":"interval","required":false,"schema":{"enum":["1m","1h"],"type":"string"}},{"description":"Inclusive lower bound on bucket time (unix seconds).","in":"query","name":"from","required":false,"schema":{"type":"integer"}},{"description":"Inclusive upper bound on bucket time (unix seconds).","in":"query","name":"to","required":false,"schema":{"type":"integer"}},{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}},{"description":"venues=all merges every ADA-paired pool of the asset into one series (the token-wide price); omitted serves the single deepest pool.","in":"query","name":"venues","required":false,"schema":{"enum":["all"],"type":"string"}},{"description":"Comma-separated venue:market ids of the asset's pools to merge into one series (the price across just those venues), the same way venues=all merges all of them. A pool quoted in another token is converted at that token's ADA rate per bucket. An id that is not a pool of the asset is a 400. Takes precedence over venues.","in":"query","name":"markets","required":false,"schema":{"type":"string"}},{"description":"The spec's one wire-format switch. Absent = verbose row objects (the default stays for existing clients). `compact` = one array per field under `columns`, same order and values — ~3x smaller decoded, for chart clients on slow connections.","in":"query","name":"encoding","required":false,"schema":{"enum":["compact"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Token-level OHLCV (deepest pool's series for now)","tags":["assets"]}},"/v1/assets/{asset}/card.png":{"get":{"description":"Logo, price, 24h change and an hourly sparkline — what a shared token link unfurls into.","operationId":"asset_card","parameters":[{"description":"Asset id: `ada.lovelace` or `<policyHex>.<assetNameHex>`. The separator-less concatenated form is accepted on input; responses always use `.`.","in":"path","name":"asset","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"image/png":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Social card (PNG, 1200x630)","tags":["assets"]}},"/v1/assets/{asset}/decomposition":{"get":{"description":"Served verbatim from the rates materialization; rates, virtual prices, and redeemable values are exact numerator/denominator rationals in base units. Interpretation (APR and friends) is a client concern.","operationId":"asset_decomposition","parameters":[{"description":"Asset id: `ada.lovelace` or `<policyHex>.<assetNameHex>`. The separator-less concatenated form is accepted on input; responses always use `.`.","in":"path","name":"asset","required":true,"schema":{"type":"string"}},{"description":"Inclusive lower bound on bucket time (unix seconds).","in":"query","name":"from","required":false,"schema":{"type":"integer"}},{"description":"Inclusive upper bound on bucket time (unix seconds).","in":"query","name":"to","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Redemption decomposition: hops, paths, per-hour rate series","tags":["rates"]}},"/v1/assets/{asset}/holders":{"get":{"description":"From the holders index (wallet-level: stake credential when present, else payment). Supply is the sum of every holder's balance — mint minus burn. 404 until the index has a row for the asset. Distribution (top-N, concentration) is planned.","operationId":"asset_holders","parameters":[{"description":"Asset id: `ada.lovelace` or `<policyHex>.<assetNameHex>`. The separator-less concatenated form is accepted on input; responses always use `.`.","in":"path","name":"asset","required":true,"schema":{"type":"string"}},{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Holder count, total supply, and FDV","tags":["assets"]}},"/v1/assets/{asset}/logo":{"get":{"description":"Cached from the Cardano token registry.","operationId":"asset_logo","parameters":[{"description":"Asset id: `ada.lovelace` or `<policyHex>.<assetNameHex>`. The separator-less concatenated form is accepted on input; responses always use `.`.","in":"path","name":"asset","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"image/png":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Registry logo (PNG)","tags":["assets"]}},"/v1/assets/{asset}/trades":{"get":{"description":"Cursor-paged, newest first, merged across every venue's rollup. `direction` is the taker's side of the base asset; on a market where this asset is the quote side, the direction still describes the base.","operationId":"asset_trades","parameters":[{"description":"Asset id: `ada.lovelace` or `<policyHex>.<assetNameHex>`. The separator-less concatenated form is accepted on input; responses always use `.`.","in":"path","name":"asset","required":true,"schema":{"type":"string"}},{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}},{"description":"Opaque page cursor from links.next.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"The newest trade a polling client already holds, in the cursor grammar (<slot>.<event_index>.<tx_hash> from any trade row). Only strictly newer rows return — a quiet poll gets an empty page instead of the full tape.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"Page size, at most 250 (default 100).","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Restrict the tape to one venue's fills (a venue slug, e.g. `sundae-v3`); omitted merges every venue.","in":"query","name":"venue","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"One asset's tape: every swap touching it, across venues","tags":["assets"]}},"/v1/card.png":{"get":{"description":"ADA price with its 24h line, plus network TVL, volume and activity.","operationId":"site_card","parameters":[],"responses":{"200":{"content":{"image/png":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Site social card (PNG, 1200x630)","tags":["meta"]}},"/v1/flows":{"get":{"description":"For each wallet class (by ADA held now: retail, 1k, 10k, 100k, 1m) and each trailing window (24h, 7d, 30d), the tokens that class accumulated (net > 0) or shed (net < 0), with gross inflow, gross outflow and a wallet count. Class membership is fixed at as_of; ADA classifies wallets and is never itself a flow token. Values are base-unit integer strings, valued at read time through the price board — a token can show heavy inflow while its price falls. Daily resolution, stated in as_of. class= and window= narrow the document; limit caps each ranked list.","operationId":"flows","parameters":[{"description":"Narrow to one wallet class by ADA held now: retail (<1k), 1k, 10k, 100k, 1m. Omitted returns every class.","in":"query","name":"class","required":false,"schema":{"enum":["retail","1k","10k","100k","1m"],"type":"string"}},{"description":"Narrow to one trailing window: 24h, 7d, or 30d. Omitted returns every window.","in":"query","name":"window","required":false,"schema":{"enum":["24h","7d","30d"],"type":"string"}},{"description":"Rows per (class, window) ranked list, at most 500 (default 50). Rows are sorted by absolute net flow.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Token inflow/outflow per wallet class over trailing windows","tags":["meta"]}},"/v1/health":{"get":{"description":"The advertisable numbers. `chain.ingest_lag_seconds` is how far Float's confirmed data trails the chain — a block is queryable once the fold reaches its slot. Request latency and throughput stats follow (CloudWatch-sourced).","operationId":"health","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Service statistics: chain-ingestion latency (and, next, request latency + throughput)","tags":["meta"]}},"/v1/lending/markets":{"get":{"description":"One row per lending market across the indexed lending venues (danogo, liqwid). Each carries the underlying asset, total supplied and borrowed (base-unit strings plus display amounts), utilization, supply and borrow APR (fractions), and TVL valued in the quote asset. APR is derived from each protocol's on-chain rate state. sort ranks by tvl (default), supply_apr, borrow_apr or utilization; venue filters to one venue.","operationId":"lending_markets","parameters":[{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}},{"description":"Ranking key: tvl (default), supply_apr, borrow_apr, utilization.","in":"query","name":"sort","required":false,"schema":{"enum":["tvl","supply_apr","borrow_apr","utilization"],"type":"string"}},{"description":"Filter to one lending venue (danogo, liqwid).","in":"query","name":"venue","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Lending markets — supply/borrow rates, sizes, utilization","tags":["meta"]}},"/v1/lending/markets/{market}":{"get":{"description":"The market's row (see /v1/lending/markets) plus its accepted collateral with loan-to-value, the protocol product, and the raw on-chain state for transparency. The market id is `venue:market`.","operationId":"lending_market","parameters":[{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"One lending market, with collateral and raw state","tags":["meta"]}},"/v1/markets":{"get":{"description":"Liquidity and volume are valued in the quote asset before ranking; a market with an unpriced side is reported with nulls and counted in meta.unranked_markets rather than ranked as zero. `window` moves the turnover window off the 24h default and keys volume/trade_count by it; every window here trails the tip by that many seconds, so 7d and 30d are NOT the whole-UTC-day volume_7d_complete/volume_30d_complete on /v1/stats; `q` searches the whole list by ticker, name, asset id or market id before it is paged.","operationId":"markets_list","parameters":[{"description":"Ranking key: liquidity (default), volume, trade_count. Both liquidity and volume are valued in the quote asset before ranking.","in":"query","name":"sort","required":false,"schema":{"enum":["liquidity","volume","trade_count"],"type":"string"}},{"description":"Which turnover window orders the list when sort is volume or trade_count: 1h, 24h (default), 7d, 30d, repeated as meta.window. Each is that many seconds back from the tip, not whole UTC days — /v1/stats serves the day-aligned figures as volume_*_complete. Every row carries EVERY window regardless — volume and trade_count are objects keyed by window name, all measured against one tip — so this narrows the ranking, never the response. Liquidity is a point-in-time reserve figure and is unaffected.","in":"query","name":"window","required":false,"schema":{"enum":["1h","24h","7d","30d"],"type":"string"}},{"description":"Substring filter over either side's ticker, registry name, on-chain name and asset id, plus the market id (venue included). Case-insensitive. Applied across the whole ranked list before paging, so meta.market_count reports the matches, not the catalogue.","in":"query","name":"q","required":false,"schema":{"type":"string"}},{"description":"Restrict to one venue (adapter registry name).","in":"query","name":"venue","required":false,"schema":{"type":"string"}},{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}},{"description":"Opaque page cursor from links.next.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Page size, at most 250 (default 100).","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Ranked market list: reserves, valued liquidity and volume","tags":["markets"]}},"/v1/markets/{market}":{"get":{"description":"Reserves are base-unit strings of each side's own asset.","operationId":"market_detail","parameters":[{"description":"Market id: `<venue>:<marketKey>`.","in":"path","name":"market","required":true,"schema":{"type":"string"}},{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"One pool/book: side assets, reserves, 24h activity","tags":["markets"]}},"/v1/markets/{market}/candles":{"get":{"description":"Served directly from the rollup materialization.","operationId":"market_candles","parameters":[{"description":"Market id: `<venue>:<marketKey>`.","in":"path","name":"market","required":true,"schema":{"type":"string"}},{"description":"Candle interval in the shared period grammar. 1m and 1h are materialized today; defaults to 1h. Series are sparse — a bucket exists only for a period that had a trade.","in":"query","name":"interval","required":false,"schema":{"enum":["1m","1h"],"type":"string"}},{"description":"Inclusive lower bound on bucket time (unix seconds).","in":"query","name":"from","required":false,"schema":{"type":"integer"}},{"description":"Inclusive upper bound on bucket time (unix seconds).","in":"query","name":"to","required":false,"schema":{"type":"integer"}},{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}},{"description":"The spec's one wire-format switch. Absent = verbose row objects (the default stays for existing clients). `compact` = one array per field under `columns`, same order and values — ~3x smaller decoded, for chart clients on slow connections.","in":"query","name":"encoding","required":false,"schema":{"enum":["compact"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Pool-level OHLCV","tags":["markets"]}},"/v1/markets/{market}/series":{"get":{"description":"Serves the venue adapter's detail facts; values are decimal strings passed through verbatim, keyed by field name in each row's values object.","operationId":"market_series","parameters":[{"description":"Market id: `<venue>:<marketKey>`.","in":"path","name":"market","required":true,"schema":{"type":"string"}},{"description":"Comma-separated detail field names (e.g. sum_invariant,circulating_lp).","in":"query","name":"fields","required":true,"schema":{"type":"string"}},{"description":"Series resolution in the shared period grammar (1h is materialized today; the default), or `raw` for every point. Raw responses stop at 5000 rows and set meta.truncated: true.","in":"query","name":"period","required":false,"schema":{"enum":["1h","raw"],"type":"string"}},{"description":"Inclusive lower bound on bucket time (unix seconds).","in":"query","name":"from","required":false,"schema":{"type":"integer"}},{"description":"Inclusive upper bound on bucket time (unix seconds).","in":"query","name":"to","required":false,"schema":{"type":"integer"}},{"description":"Credential grouping: wallet (default when the address has a stake credential) groups every address sharing it; payment is the one payment credential, and the default for enterprise addresses, which declare no grouping.","in":"query","name":"scope","required":false,"schema":{"enum":["payment","wallet"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Detail-field series for one market (interest, invariants, supply)","tags":["markets"]}},"/v1/markets/{market}/trades":{"get":{"description":"Cursor-paged from the rollup's swap facts. `direction` is the taker's side of the base asset, read from the pool's signed net change.","operationId":"market_trades","parameters":[{"description":"Market id: `<venue>:<marketKey>`.","in":"path","name":"market","required":true,"schema":{"type":"string"}},{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}},{"description":"Opaque page cursor from links.next.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"The newest trade a polling client already holds, in the cursor grammar (<slot>.<event_index>.<tx_hash> from any trade row). Only strictly newer rows return — a quiet poll gets an empty page instead of the full tape.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"Page size, at most 250 (default 100).","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"One pool's tape: executed swaps, newest first","tags":["markets"]}},"/v1/openapi.json":{"get":{"description":"Derived from the same definitions the handlers register; never hand-maintained.","operationId":"openapi","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"This API, as OpenAPI 3.1 — generated from the route table","tags":["meta"]}},"/v1/portfolio":{"get":{"description":"Combines over UTxOs, not over totals. Two listed addresses sharing a stake credential reach the same rows, so each UTxO is attributed to the first address that names it and the per-address subtotals stay disjoint. Exclusivity holds across the whole set.","operationId":"combined_portfolio","parameters":[{"description":"Comma-separated bech32 addresses, at most 25.","in":"query","name":"addresses","required":true,"schema":{"type":"string"}},{"description":"Credential grouping: wallet (default when the address has a stake credential) groups every address sharing it; payment is the one payment credential, and the default for enterprise addresses, which declare no grouping.","in":"query","name":"scope","required":false,"schema":{"enum":["payment","wallet"],"type":"string"}},{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"One portfolio over many addresses: combined total plus per-address","tags":["addresses"]}},"/v1/quotes":{"get":{"description":"Rates are exact numerator/denominator rationals in base units. period=1h keeps the last point per hour bucket; period=raw serves every point (capped at 5000 rows, meta.truncated: true when capped).","operationId":"quotes","parameters":[{"description":"Base asset of the pair: `ada.lovelace` or `<policyHex>.<assetNameHex>` (the separator-less concatenated form is accepted).","in":"query","name":"base","required":true,"schema":{"type":"string"}},{"description":"Quote asset of the pair (same forms as base).","in":"query","name":"quote","required":true,"schema":{"type":"string"}},{"description":"Quote kind; defaults to redemption.","in":"query","name":"kind","required":false,"schema":{"enum":["redemption","mid","oracle"],"type":"string"}},{"description":"Restrict to one venue (adapter registry name).","in":"query","name":"venue","required":false,"schema":{"type":"string"}},{"description":"Restrict to one market key (the venue-scoped key, without the `<venue>:` prefix).","in":"query","name":"market","required":false,"schema":{"type":"string"}},{"description":"Series resolution in the shared period grammar (1h is materialized today; the default), or `raw` for every point. Raw responses stop at 5000 rows and set meta.truncated: true.","in":"query","name":"period","required":false,"schema":{"enum":["1h","raw"],"type":"string"}},{"description":"Inclusive lower bound on bucket time (unix seconds).","in":"query","name":"from","required":false,"schema":{"type":"integer"}},{"description":"Inclusive upper bound on bucket time (unix seconds).","in":"query","name":"to","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Quote series for one asset pair, from the rates facts","tags":["rates"]}},"/v1/rates/graph":{"get":{"description":"One edge per (base, quote, venue, market) redemption quote. The list is paged (limit/cursor) because it grows with the pool set; `base=` filters to the assets you care about, and `edge_count` reports the whole matching set rather than the page.","operationId":"rates_graph","parameters":[{"description":"Set to `stables` to return only the registered USD stablecoin ids and the edge count, omitting the edge list itself.","in":"query","name":"fields","required":false,"schema":{"enum":["stables"],"type":"string"}},{"description":"Comma-separated asset ids; returns only edges whose base is one of them. A consumer that needs the edges for the assets it holds should filter rather than page the whole graph.","in":"query","name":"base","required":false,"schema":{"type":"string"}},{"description":"Opaque page cursor from links.next.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"Page size, at most 250 (default 100).","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"The redemption graph: which assets redeem into which","tags":["rates"]}},"/v1/search":{"get":{"description":"Matches registry ticker/name, the on-chain name, and id prefixes; asset results rank by liquidity.","operationId":"search","parameters":[{"description":"Search text: ticker, name, on-chain name, policy, or id prefix.","in":"query","name":"q","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Assets and markets, ranked","tags":["meta"]}},"/v1/signals":{"get":{"description":"Whale trades, stablecoin depegs and other abnormal market events, newest first, each with a kind, a score and the time it happened. The same feed the Pulse tab renders and the sundae Discord posts.","operationId":"signals","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"The Pulse curated feed of unusual market events","tags":["meta"]}},"/v1/stats":{"get":{"description":"Volume is valued in the quote asset, never summed raw: a fifth of stored swaps quote in something other than ADA. Trades whose quote asset has no price are counted separately and excluded. volume_1d/7d/30d_complete cover whole UTC days ending at volume_series.last_complete_day, and each _complete_prev twin is the window of equal length before it, so the two sides of a change are the same shape; a _complete_prev the series cannot cover is null. The _complete suffix marks a whole-UTC-day window throughout the API: the 7d and 30d on /v1/markets are trailing seconds from the tip and are NOT these figures. volume_24h and trades_24h are the older rolling fields, measured from the day boundary below the tip rather than from the tip: prefer the day windows for anything compared over time. Each volume_series point carries that day's total trade count as well as its volume, so any window either figure is read over can be summed from the series itself.","operationId":"stats","parameters":[{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Per-venue and total volume, TVL, and a daily volume and trade series","tags":["meta"]}},"/v1/trades":{"get":{"description":"Cursor-paged, newest first, k-way merged across every venue's tape. The same swap facts the per-asset and per-market tapes serve, unfiltered.","operationId":"recent_trades","parameters":[{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}},{"description":"Opaque page cursor from links.next.","in":"query","name":"cursor","required":false,"schema":{"type":"string"}},{"description":"The newest trade a polling client already holds, in the cursor grammar (<slot>.<event_index>.<tx_hash> from any trade row). Only strictly newer rows return — a quiet poll gets an empty page instead of the full tape.","in":"query","name":"after","required":false,"schema":{"type":"string"}},{"description":"Page size, at most 250 (default 100).","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"The global tape: recent swaps across every venue and token","tags":["markets"]}},"/v1/txs/{tx_hash}":{"get":{"description":"`swaps` and `fills` treat the hash as an execution: what the batch traded, and which order UTxOs that decomposes into. `placed` treats it as an order transaction: where each order it created executed — across venues, when an aggregator split the trade. 404 when Float recorded nothing for the hash.","operationId":"tx_detail","parameters":[{"description":"Transaction hash, 64 hex characters.","in":"path","name":"tx_hash","required":true,"schema":{"type":"string"}},{"description":"Denomination for prices and ADA-denominated amounts. usd is stablecoin-implied (meta.quote_source: usdm-implied).","in":"query","name":"quote","required":false,"schema":{"enum":["ada","usd"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"One transaction's trades, in both of its roles","tags":["markets"]}},"/v1/venues":{"get":{"description":"The transparency page. All running adapters decode on-chain data (trust: chain-verified).","operationId":"venues","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"OK"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}},"summary":"Coverage registry: adapters, trust badges, per-venue tips","tags":["venues"]}}},"servers":[{"url":"https://api.float.sundae.fi"}]}