Public aggregated GPU market statistics for the landing page
const url = 'https://api.flotera.com/api/v1/public/market-stats';const options = {method: 'GET'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.flotera.com/api/v1/public/market-statsThe one unauthenticated market surface. Serves aggregated medians, occupancy and 7-day trends per GPU class per market source — data derived exclusively from the shared, tenant-free market cache; no number here is computed from anyone’s fleet.
Deliberately NOT served: offer books, per-host minimum prices, any machine listings. Aggregates read as “we observe the market”; a public mirror of a venue’s search output is grounds for that venue to cut the access this index lives on.
The response is identical for every caller and changes at the market
freshness cadence, so it ships Cache-Control: public, max-age=300
(the CDN edge absorbs the traffic) and Access-Control-Allow-Origin: * — public data, no credentials involved.
indicative_monthly_gross_usd is median × 720 h × occupancy. It is
neither net nor a promise of income — platform fees and the owner’s
electricity are unknown here — and the field name says exactly what
was computed.
Responses
Section titled “Responses”Aggregated market statistics.
object
RFC 3339 UTC with microsecond precision.
GPU classes in the digest — the deepest markets of the window, chosen by offer depth, never by anyone’s fleet.
object
A market DATA source — a superset of MarketplaceName. Tier-B venues (tensordock, runpod, akash) feed the price index only: no accounts, no listings, no rentals — see infrastructure/26-market-intelligence.md §3. Execution paths (accounts, links, offers) keep MarketplaceName; a tier-B name is never valid there.
RFC 3339 UTC with microsecond precision, or null.
Which population of machines the prices describe. all includes rented machines; available_only means the query filtered to machines free to rent; reported means there is no sample of ours at all — the venue publishes its own aggregate figures (tier-B sources), computed by an unpublished method.
Without this, comparing marketplaces is misleading. Vast is queried with rentable = true, so its median describes what was NOT taken and skews high; Clore returns the whole market including the attractively-priced machines already rented, and skews low. On live data the gap is a consistent 1.8-2.4x across every card, and how much of it is real cannot be stated. A UI that presents that gap as measured pushes a fleet owner off a marketplace on the strength of a sampling artefact.
How the LAST attempt ended, separate from when data was last fresh: an hour-old market looks identical whether the fetcher is healthy (freshness window) or broken (a run of failures).
rate_limited is not folded into failed — hitting a rate limit is normal traffic shaping against someone else’s API, not a fault, and confusing the two sends the operator to reissue a working key.
object
A market DATA source — a superset of MarketplaceName. Tier-B venues (tensordock, runpod, akash) feed the price index only: no accounts, no listings, no rentals — see infrastructure/26-market-intelligence.md §3. Execution paths (accounts, links, offers) keep MarketplaceName; a tier-B name is never valid there.
Decimal string or null when unknown.
Share of cards rented, 0..1. Null — nobody measured it.
Who measured the occupancy — the venue’s own market-wide figure or the share inside our sample. Different populations measured by different parties; a digest that merged them would lie about its provenance.
Median × 720 h × occupancy, 2 decimal places. Not net, not a promise — present only when both inputs are measured. For a floor-only venue (RunPod publishes just its minimum) it stays null: the market floor times occupancy would promise income from the single cheapest host’s price.
Daily medians over the window, oldest first. Empty for reported -only sources until their history accumulates.
object
RFC 3339 UTC with microsecond precision.
Decimal string or null when unknown.
Example
{ "generated_at": "2026-07-25T10:15:30.123456Z", "sources": [ { "marketplace": "vast", "price_sample": "all", "last_fetch_status": "ok" } ], "rows": [ { "marketplace": "vast", "occupancy_source": "reported", "trend": [ { "at": "2026-07-25T10:15:30.123456Z" } ] } ]}