# Changelog

Every change to the contract, by dated version.

Each response names its version in `Gloom-Version`. Send the header to pin one; an unknown version is a free `400 version_invalid`.

`GET /v1/datasets/changelog` returns this list as JSON.

## 2026-10-21: One contract for every route

- Every response is `{data, meta}`, reference routes included.
- Errors are `{error: {type, code, message, param, requestId, docUrl}}`. A 4xx is never charged.
- `meta` renames `asOf`, `historyStarts` and `lastUpdated` to `dataThrough`, `historyStart` and `updatedAt`. `disclaimer` and `note` become `notices[]`. `meta.asOf` is now the point in time you asked for, or null.
- Every list pages with `limit` and an opaque `cursor`; `offset` and Congress `filingOffset` are gone. `meta.page` and `meta.next` give the next page. Without `limit`, a route reads its default page size, which the OpenAPI document lists and `meta.page.limit` names.

**7 more changes**

- Every response sends `Gloom-Version`, `Request-Id` and an `ETag`; `X-Request-Id` is gone. `If-None-Match` gets a free `304`.
- Keyed responses send `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`.
- No more plan fields (`access`, `locked`, `preview`, `proRequired`, `entitlement`) or collection internals in payloads. A quote's `dataSource` becomes `delayed: true` or `false`.
- Values lose binary noise such as 77473014.05999999. CPI names each figure's basis in `data.basis`.
- No key: `WWW-Authenticate: Bearer realm="Gloom Datasets"` without `error`, as RFC 6750 asks.
- Job postings say `hasMore` instead of counting every open role in `total`.
- Samples moved out of the OpenAPI document to each dataset's sample route, such as `/v1/datasets/gpu/sample`.

- [Previous OpenAPI](https://gloom.sh/datasets/docs/openapi)
- [Next GPU rental prices](https://gloom.sh/datasets/docs/datasets/gpu)
