The four endpoints
/latest — what is true now
/latest — what is true now
Current values, one row per thing. This is the endpoint for “what is the price today”.
/as-of?at=… — what was true then
/as-of?at=… — what was true then
The same shape as
/latest, rewound to a date you choose. at takes a date or a full
timestamp; a plain date means the end of that day, so at=2026-06-01 gives you the position at
the close of 1 June.If nothing was published on that exact date — a weekend, a holiday, a gap in a vendor’s feed —
you get the most recent value before it, rather than an empty response./history?start=…&end=… — what changed
/history?start=…&end=… — what changed
Everything that changed between two dates. See How history works below,
which is the one behaviour worth reading properly if you are coming from v1.If you leave
start out, you get a sensible recent window for that data type — 30 days for
rental prices and indices, and 90 days for everything else. Each /history endpoint states
its own default./metadata — what can I ask for
/metadata — what can I ask for
The values that data type accepts as filters, what it covers, and how far back you can read
(
history_starts_at). It is quick, and it is the right first call for any type — it tells you
what a query will accept before you write one./history and /metadata. A settled deal is an event that
happened on a date, so there is no “current value” to ask for. The other two endpoints return 404
on that type.
What a response looks like
Every response that returns rows has the same two parts:data is what you asked for. meta describes the request it answers — the sort that was applied,
the date range that was used, and whether there is more to fetch. If you sent no sort parameters,
meta.sort tells you which order you got rather than leaving you to guess.
Fields with no value come back as null rather than being left out, so a key you expect is always
there. null means not published — which is not the same as zero.
Paging
Responses come back a page at a time. To get the next page, call what the response gives you.meta.next gives you that call in two forms. Both describe the same request, so pick whichever
fits your HTTP client:
Mid-walk,
meta.next looks like this:
meta.next is null you have everything. meta.has_more says the same thing as a boolean.
page_size defaults to 100 and goes up to 1000. There is no page number and no total count —
has_more answers the question a paging loop actually asks.
Date ranges
start is included and end is not. Consecutive ranges therefore join up without overlapping, so
you can pull a year of data month by month and never see the same row twice.
Plain dates behave as you would expect: ?start=2026-06-01&end=2026-06-01 is that whole day.
All times are UTC.
How history works
/history returns records that changed inside your date range.
Which endpoint you want depends on the question:
- Charting a series over time, or syncing changes since you last looked?
/history. - What was the price on a particular day?
/as-of— that is exactly what it answers.
Consistent names
The same thing is spelled the same way on every data type, so once you have learned a name you know it everywhere. Where a concept genuinely differs, so does the name — hardware listings takecountry, not region, because a country is not a cloud region.
Each type sorts on its own set of fields, always with a sensible default, and the order applied is
always reported back in meta.sort. Filters that take a list accept up to 20 values.