> ## Documentation Index
> Fetch the complete documentation index at: https://platform.trendlinelabs.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

The newest entry is first.

## 2026-10-20 — Easier-to-read endpoint descriptions; opinion is no longer a venue; the price snapshot's closed legs

doc-sha256: 7183692514a5ad7428732dea03125698248326c951d277b21ced42b25abe33b2
generated-with: fastapi 0.136.3, pydantic 2.13.4

* The order book, candles, trades and events descriptions are split into short sections: a summary,
  the fields that tell you how fresh the data is, notes, and an errors table (status, code, when).
  The account endpoints' descriptions get the same layout while those endpoints are on.
* opinion is removed from every `venue` choice (events, order book, candles, trades, the price snapshot
  and the stream). A request naming venue=opinion now answers 422 invalid\_request instead of
  venue\_unsupported, and `min_venues` goes up to 4. No opinion price, book, candle or trade was ever
  served; only the event fields in the next bullet counted or named it.
* On the stream, a subscribe message that names opinion in any channel is refused whole with an
  invalid\_request error, so none of its channels is subscribed. Before, only the opinion channel was
  refused, with venue\_unsupported.
* The events list's `platform_count` and `venues`, and one event's `platform_count`, `source_lanes` and
  each market's `source_lanes`, `volume_by_platform`, `volume_24h_by_platform` and
  `price_24h_change_by_platform`, count and name only the four public venues. A market's `volume_usd`
  is the sum of its `volume_by_platform`.
* The price snapshot's `closed` markers changed shape: each marker's `platforms` is a list of closed
  legs, each with `venue`, `venue_id`, `last_quote_cents` and `quoted_at`, instead of a list of venue
  names. Until now a request for a market with a closed leg answered 500 internal\_error, so no marker
  was ever served in the old shape. Only the four public venues' legs are listed, and a market whose
  only closed leg is on another venue has no marker.

## 2026-10-20 — Browser requests from the documentation site

doc-sha256: 1116ef492485a555a4a84328d97e54fcd079e59c81816a5dd7f0c91358b1f08c
generated-with: fastapi 0.136.3, pydantic 2.13.4

* The documentation site, [https://platform.trendlinelabs.ai](https://platform.trendlinelabs.ai), can send GET requests to
  `/public/v1/` from the browser with the key you paste into its "try it" panel. Those answers carry
  `Access-Control-Allow-Origin` and expose `X-RateLimit-*`, `Retry-After` and `X-Request-Id`; no
  cookies are sent or accepted.
* Every other browser origin is unchanged. Keep keys on your server: never ship one in browser code.
* The document's description changed; no route, parameter or response schema changed.

## 2026-10-20 — Request access on the website

doc-sha256: b486042e5ee61498bfb76cc1b765bc00b4c942a120d9243cc30a2094c27355a5
generated-with: fastapi 0.136.3, pydantic 2.13.4

* API access is requested on the website's API keys page, [https://trendlinelabs.ai/developer](https://trendlinelabs.ai/developer), instead of
  by contacting the team. The same page creates, lists and revokes keys once access is granted.
* The access\_not\_granted message now names that page. No route, parameter or response schema changed.

## 2026-10-19 — Limitless trades

doc-sha256: a19adf2c5da7d0c697e0bb50877034b3497a34b9a0b3a7e182c412ef2cca8f93
generated-with: fastapi 0.136.3, pydantic 2.13.5

* getTrades serves Limitless trades (`venue=limitless`), which answered 422 `venue_unsupported` before.
  Each trade is `ts_ms`, `outcome` and `notional_usd`, as on every other venue. A Limitless market with
  no trade record yet answers 503 `upstream_unavailable` ("no live tape for this leg"), as any market
  with no trade record does; some Limitless markets have none.
* On the stream, Limitless trades subscriptions are accepted. `notional_usd` is price times size in USD.
* A Limitless trade can reach us about a minute after it happened (an estimate from the one Limitless
  trade observed so far). Limitless trades are not refused by the Limitless liveness check, which
  applies to books only.
* The Limitless liveness check for books now also requires that the feed received Limitless updates
  live in its once-a-minute record, not only that it applied them.
* predict.fun and Opinion trades are still not served (422 `venue_unsupported`). The getTrades and
  `venue` descriptions changed; no route, parameter or response schema changed.

## 2026-10-19 — Limitless books stop when the Limitless feed stops

doc-sha256: c8a45f29f2edca26d921df8176e7cb741536ee9adde8decdc84b1f18ad734aad
generated-with: fastapi 0.136.3, pydantic 2.13.5

* getOrderbook with `venue=limitless` answers 503 `upstream_unavailable` while our market-data feed's own
  once-a-minute record shows no Limitless update applied in the last 120 s, or that record is missing or
  unreadable, even for a book younger than its 3600 s `max_age_s`: the Limitless feed may have stopped.
  If our own store cannot be read for this check, the answer is 503 `dependency_unavailable`. Serving
  resumes once the record shows Limitless updates (checked about every 15 s).
* On the stream, Limitless book and price subscriptions get status `unavailable` in the same cases, with
  the same codes; a Limitless book update the stream itself receives also counts as the feed being live.
  Frames resume when the feed does.
* Other venues are unchanged. No route, parameter or response schema changed.

## 2026-10-17 — Limitless order books

doc-sha256: c8a45f29f2edca26d921df8176e7cb741536ee9adde8decdc84b1f18ad734aad
generated-with: fastapi 0.136.3, pydantic 2.13.5

* getOrderbook serves Limitless books (`venue=limitless`), which answered 422 `venue_unsupported` before.
  Sizes are in contracts and prices 0..1, as on every other venue; `max_age_s` is 3600.
* A Limitless book whose last change is older than 3600 s answers 503 `upstream_unavailable`, so a quiet
  Limitless market can be refused while its venue still quotes it.
* Limitless trades are still not served (422 `venue_unsupported`).
* No route, parameter or response schema changed.

## 2026-10-15 — free access, granted on request

doc-sha256: c8a45f29f2edca26d921df8176e7cb741536ee9adde8decdc84b1f18ad734aad
generated-with: fastapi 0.136.3, pydantic 2.13.5

* API access is free and granted on request: contact us, and we enable your account; then create keys as
  before. Every granted account is on one free plan.
* New 403 code `access_not_granted` on every operation and on key creation: the account has no active
  grant (never granted, or the grant was withdrawn). `x-known-codes` lists it.
* getKey's example `tier` is `FREE` (was `PREMIUM`): every granted account is on the free plan.
* Withdrawing a grant also stops the account's existing keys, on requests and on open streams.
* No route, parameter or body changed.

## 2026-10-14 — opportunity example numbers as sent

doc-sha256: 689ec1070004558c8cd6853ef9685083d59ca129004d224b73f60a383b548d6e
generated-with: fastapi 0.136.3, pydantic 2.13.5

* The listOpportunities example writes its number fields as the route sends them: `yes_price` 41.0,
  `no_price` 55.0, `profit_cents` 2.0, `total_cost_cents` 98.0, `estimated_fee_cents` 2.0,
  `gas_fee_cents` 0.0, `max_contracts` 120.0, and the Kalshi and Polymarket asks and sizes likewise.
  The values are unchanged; each is a JSON number, so read them as numbers, not integers.
* No route, parameter, status or body changed.

## 2026-10-14 — opportunity example and field wording

doc-sha256: 4ec85ad05df0cad1d56cb8d1632e265b0993d99928cadd39654132efe1f27d34
generated-with: fastapi 0.136.3, pydantic 2.13.5

* `arb_type` names its venue tokens: `kalshi` and `poly` (for example `kalshi_yes_poly_no`); `limitless` and
  `opinion` are not yet confirmed in a live answer.
* `total_cost_cents` is both legs plus `estimated_fee_cents` and `gas_fee_cents`; `profit_cents` is 100 minus
  it. Both legs' prices, the fees and the profit are whole cents.
* The listOpportunities example now uses `kalshi_yes_poly_no` and whole cents: yes 41, no 55, fee 2, gas 0,
  total 98, profit 2.
* predict.fun's bids and NO ask, and the 24-hour price change by venue, are labelled "unit not yet confirmed".
* The previous entry's example changes it did not name: getKey's `tier` became `PREMIUM` (was `PRO`) and
  getOrderbook's `max_age_s` became 1200 (was 60).
* No route, parameter, status or body changed.

## 2026-10-14 — units for opportunity and snapshot prices

doc-sha256: 5c3b3dd5496929f470bb9343cc11295eb56dbb7feb175da58960ead364322371
generated-with: fastapi 0.136.3, pydantic 2.13.5

* Opportunity prices are stated in cents (`yes_price`, `no_price`, and the Kalshi and Polymarket asks);
  the Limitless asks' unit is not yet confirmed.
* Price-snapshot asks are cents on every venue but Polymarket, which is 0..1.
* Examples updated to match. No route, parameter, status or body changed.

## 2026-10-14 — v1 reference, guides and examples

doc-sha256: 87c861e67276ac2b5e9d00568466cdf364693baf91af049447326029231b20f7
generated-with: fastapi 0.136.3, pydantic 2.13.5

* The reference is generated from the code: every error answer is the `PublicError` envelope, every
  field and parameter is described, and each operation has an id, a summary and a 200 example.
* `x-known-codes` on the error `code` lists the codes this version sends.
* Guides: getting started, authentication, rate limits, errors, pagination, freshness, finding markets,
  venues and versioning; curl, Python and JavaScript examples for every operation.
* No route, parameter, status or body changed.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.