Rothera — Tool Reference
Query Rothera Markets end-of-day data (not live quotes): prices, daily history, trades, movers
Your AI assistant discovers and invokes these tools through the
MCP Server's meta tools —
it calls execute_tool with the tool name and arguments below.
# get_market_changes read
Compute stored 7-day or 30-day Rothera price and volume changes.
Full description
Return backend-computed changes for one Rothera market.
| Parameter | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Rothera contract symbol returned by search_markets. |
windows | array<"7d" | "30d"> | No |
Parameter schema (JSON)
{
"properties": {
"symbol": {
"description": "Rothera contract symbol returned by search_markets.",
"minLength": 1,
"title": "Symbol",
"type": "string"
},
"windows": {
"items": {
"enum": [
"7d",
"30d"
],
"type": "string"
},
"maxItems": 2,
"minItems": 1,
"title": "Windows",
"type": "array"
}
},
"required": [
"symbol"
],
"title": "GetMarketChangesParams",
"type": "object",
"additionalProperties": false
} Result schema (JSON)
{
"$defs": {
"Change": {
"properties": {
"window": {
"enum": [
"7d",
"30d"
],
"title": "Window",
"type": "string"
},
"samples": {
"title": "Samples",
"type": "integer"
},
"open": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Open"
},
"close": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Close"
},
"price_abs": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Price Abs"
},
"price_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Percent price change, not a fraction.",
"title": "Price Pct"
},
"volume_24h_abs": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Volume 24H Abs"
},
"volume_24h_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Volume 24H Pct"
}
},
"required": [
"window",
"samples"
],
"title": "Change",
"type": "object"
}
},
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"venue": {
"default": "rothera",
"title": "Venue",
"type": "string"
},
"is_eod": {
"default": true,
"description": "Always true: this toolkit exposes stored end-of-day data, never a live quote feed.",
"title": "Is Eod",
"type": "boolean"
},
"data_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "UTC session date (YYYY-MM-DD) of the newest observation represented by this result. Null whenever the response carries no single shared observation date, which is more than the catalogue case: catalogue, ranking and changes responses (search_markets, list_categories, get_movers, get_market_changes) never carry one; a successful but empty result (no history points) has none; and every error result leaves it null. Every write site runs its source value through the same validation, so a snapshot timestamp, the LAST history point's timestamp (the newest only insofar as the backend returns points oldest first, which this toolkit preserves rather than re-checks), or a trade-tape session_date is emitted only when it starts with a real YYYY-MM-DD calendar date; anything else, including an impossible date such as 2026-02-30, yields none rather than a value in some other shape. A null therefore means 'no shared date for this response', never 'no data behind this response'.",
"title": "Data Date"
},
"source_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Null for market-data responses: the API intentionally does not expose a raw Rothera source-file URL. Use as_of/source_url on list_contract_terms, whose data is a public directory listing.",
"title": "Source Url"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"symbol": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Symbol"
},
"changes": {
"items": {
"$ref": "#/$defs/Change"
},
"title": "Changes",
"type": "array"
},
"note": {
"default": "Only 7d and 30d windows are supported for Rothera's daily EOD source. Rothera values are end-of-day settlement marks, not live quotes or necessarily last executions. Rothera published a 0.5 placeholder on 1,600 of 2,717 measured contracts (2026-08-26): it means 'no market' only when both volume AND open_interest are zero. A 0.5 with open interest is a real mark on a contract that did not trade in that session; do not null or filter it. The wider no-trade-that-session population was 2,121 rows, whereas 1,635 had never traded (volume and open_interest both zero).",
"title": "Note",
"type": "string"
},
"price_basis": {
"default": "eod_settlement",
"description": "Always 'eod_settlement': 0-1 end-of-day settlement marks, not live quotes or necessarily last executions. Rothera values are end-of-day settlement marks, not live quotes or necessarily last executions. Rothera published a 0.5 placeholder on 1,600 of 2,717 measured contracts (2026-08-26): it means 'no market' only when both volume AND open_interest are zero. A 0.5 with open interest is a real mark on a contract that did not trade in that session; do not null or filter it. The wider no-trade-that-session population was 2,121 rows, whereas 1,635 had never traded (volume and open_interest both zero).",
"title": "Price Basis",
"type": "string"
}
},
"required": [
"success"
],
"title": "GetMarketChangesResult",
"type": "object"
} # get_market_details read
Read the latest stored end-of-day snapshot for one Rothera market.
Full description
Return a stored EOD snapshot. No live book, bid, ask, or midpoint is inferred.
| Parameter | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Rothera contract symbol returned by search_markets. |
Parameter schema (JSON)
{
"properties": {
"symbol": {
"description": "Rothera contract symbol returned by search_markets.",
"minLength": 1,
"title": "Symbol",
"type": "string"
}
},
"required": [
"symbol"
],
"title": "GetMarketDetailsParams",
"type": "object",
"additionalProperties": false
} Result schema (JSON)
{
"$defs": {
"Snapshot": {
"properties": {
"market_id": {
"title": "Market Id",
"type": "string"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Title"
},
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Category"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Status"
},
"ts": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Timestamp of the latest stored EOD snapshot.",
"title": "Ts"
},
"price": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Rothera values are end-of-day settlement marks, not live quotes or necessarily last executions. Rothera published a 0.5 placeholder on 1,600 of 2,717 measured contracts (2026-08-26): it means 'no market' only when both volume AND open_interest are zero. A 0.5 with open interest is a real mark on a contract that did not trade in that session; do not null or filter it. The wider no-trade-that-session population was 2,121 rows, whereas 1,635 had never traded (volume and open_interest both zero).",
"title": "Price"
},
"volume": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Stored contract volume, when available.",
"title": "Volume"
},
"volume_24h": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Latest completed EOD-session contract volume.",
"title": "Volume 24H"
},
"open_interest": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Open Interest"
}
},
"required": [
"market_id"
],
"title": "Snapshot",
"type": "object"
}
},
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"venue": {
"default": "rothera",
"title": "Venue",
"type": "string"
},
"is_eod": {
"default": true,
"description": "Always true: this toolkit exposes stored end-of-day data, never a live quote feed.",
"title": "Is Eod",
"type": "boolean"
},
"data_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "UTC session date (YYYY-MM-DD) of the newest observation represented by this result. Null whenever the response carries no single shared observation date, which is more than the catalogue case: catalogue, ranking and changes responses (search_markets, list_categories, get_movers, get_market_changes) never carry one; a successful but empty result (no history points) has none; and every error result leaves it null. Every write site runs its source value through the same validation, so a snapshot timestamp, the LAST history point's timestamp (the newest only insofar as the backend returns points oldest first, which this toolkit preserves rather than re-checks), or a trade-tape session_date is emitted only when it starts with a real YYYY-MM-DD calendar date; anything else, including an impossible date such as 2026-02-30, yields none rather than a value in some other shape. A null therefore means 'no shared date for this response', never 'no data behind this response'.",
"title": "Data Date"
},
"source_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Null for market-data responses: the API intentionally does not expose a raw Rothera source-file URL. Use as_of/source_url on list_contract_terms, whose data is a public directory listing.",
"title": "Source Url"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"market": {
"anyOf": [
{
"$ref": "#/$defs/Snapshot"
},
{
"type": "null"
}
],
"default": null
},
"note": {
"default": "Rothera values are end-of-day settlement marks, not live quotes or necessarily last executions. Rothera published a 0.5 placeholder on 1,600 of 2,717 measured contracts (2026-08-26): it means 'no market' only when both volume AND open_interest are zero. A 0.5 with open interest is a real mark on a contract that did not trade in that session; do not null or filter it. The wider no-trade-that-session population was 2,121 rows, whereas 1,635 had never traded (volume and open_interest both zero).",
"title": "Note",
"type": "string"
},
"price_basis": {
"default": "eod_settlement",
"description": "Always 'eod_settlement': 0-1 end-of-day settlement marks, not live quotes or necessarily last executions. Rothera values are end-of-day settlement marks, not live quotes or necessarily last executions. Rothera published a 0.5 placeholder on 1,600 of 2,717 measured contracts (2026-08-26): it means 'no market' only when both volume AND open_interest are zero. A 0.5 with open interest is a real mark on a contract that did not trade in that session; do not null or filter it. The wider no-trade-that-session population was 2,121 rows, whereas 1,635 had never traded (volume and open_interest both zero).",
"title": "Price Basis",
"type": "string"
},
"volume_units": {
"default": "contracts",
"description": "Always 'contracts'. Rothera volume, open interest, and trade quantities are contract quantities, never USD notional; do not compare them directly with Polymarket's identically named USD fields.",
"title": "Volume Units",
"type": "string"
}
},
"required": [
"success"
],
"title": "GetMarketDetailsResult",
"type": "object"
} # get_market_history read
Read stored daily end-of-day history for one Rothera market.
Full description
Return daily EOD history with the market-data API's backwards cursor.
| Parameter | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Rothera contract symbol returned by search_markets. |
since | string | null | No | Optional ISO-8601 lower bound; omit to page retained coverage. |
until | string | null | No | Optional inclusive ISO-8601 upper bound. |
limit | integer | No | Daily points returned oldest first. Default: 90 |
Parameter schema (JSON)
{
"properties": {
"symbol": {
"description": "Rothera contract symbol returned by search_markets.",
"minLength": 1,
"title": "Symbol",
"type": "string"
},
"since": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional ISO-8601 lower bound; omit to page retained coverage.",
"title": "Since"
},
"until": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional inclusive ISO-8601 upper bound.",
"title": "Until"
},
"limit": {
"default": 90,
"description": "Daily points returned oldest first.",
"maximum": 365,
"minimum": 2,
"title": "Limit",
"type": "integer"
}
},
"required": [
"symbol"
],
"title": "GetMarketHistoryParams",
"type": "object",
"additionalProperties": false
} Result schema (JSON)
{
"$defs": {
"HistoryPoint": {
"properties": {
"ts": {
"description": "Start timestamp of this stored daily bucket.",
"title": "Ts",
"type": "string"
},
"open": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Open"
},
"high": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "High"
},
"low": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Low"
},
"close": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Rothera values are end-of-day settlement marks, not live quotes or necessarily last executions. Rothera published a 0.5 placeholder on 1,600 of 2,717 measured contracts (2026-08-26): it means 'no market' only when both volume AND open_interest are zero. A 0.5 with open interest is a real mark on a contract that did not trade in that session; do not null or filter it. The wider no-trade-that-session population was 2,121 rows, whereas 1,635 had never traded (volume and open_interest both zero).",
"title": "Close"
},
"volume": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Estimated volume in this bucket, where cumulative volume permits it.",
"title": "Volume"
},
"volume_24h": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Volume 24H"
}
},
"required": [
"ts"
],
"title": "HistoryPoint",
"type": "object"
}
},
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"venue": {
"default": "rothera",
"title": "Venue",
"type": "string"
},
"is_eod": {
"default": true,
"description": "Always true: this toolkit exposes stored end-of-day data, never a live quote feed.",
"title": "Is Eod",
"type": "boolean"
},
"data_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "UTC session date (YYYY-MM-DD) of the newest observation represented by this result. Null whenever the response carries no single shared observation date, which is more than the catalogue case: catalogue, ranking and changes responses (search_markets, list_categories, get_movers, get_market_changes) never carry one; a successful but empty result (no history points) has none; and every error result leaves it null. Every write site runs its source value through the same validation, so a snapshot timestamp, the LAST history point's timestamp (the newest only insofar as the backend returns points oldest first, which this toolkit preserves rather than re-checks), or a trade-tape session_date is emitted only when it starts with a real YYYY-MM-DD calendar date; anything else, including an impossible date such as 2026-02-30, yields none rather than a value in some other shape. A null therefore means 'no shared date for this response', never 'no data behind this response'.",
"title": "Data Date"
},
"source_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Null for market-data responses: the API intentionally does not expose a raw Rothera source-file URL. Use as_of/source_url on list_contract_terms, whose data is a public directory listing.",
"title": "Source Url"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"symbol": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Symbol"
},
"bucket": {
"default": "1d",
"title": "Bucket",
"type": "string"
},
"since": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Since"
},
"until": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Until"
},
"points": {
"items": {
"$ref": "#/$defs/HistoryPoint"
},
"title": "Points",
"type": "array"
},
"count": {
"default": 0,
"title": "Count",
"type": "integer"
},
"truncated": {
"default": false,
"description": "Passed through from the backend: more retained history exists beyond this page. It does not promise a usable cursor, because a truncated page carrying no points leaves continue_from null and paging cannot be continued from this response. False on every error result.",
"title": "Truncated",
"type": "boolean"
},
"continue_from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Set only when truncated is true AND this response has at least one point: it is then the ts of the FIRST point in points, to pass back as until to page backwards, and that boundary point repeats. It is the oldest ts only insofar as the backend returns points oldest first (see limit): this toolkit preserves the backend's order and neither sorts nor re-checks it. Null otherwise, which includes an untruncated page, a truncated page with zero points, and every error result.",
"title": "Continue From"
},
"note": {
"default": "Daily stored EOD history only. Rothera values are end-of-day settlement marks, not live quotes or necessarily last executions. Rothera published a 0.5 placeholder on 1,600 of 2,717 measured contracts (2026-08-26): it means 'no market' only when both volume AND open_interest are zero. A 0.5 with open interest is a real mark on a contract that did not trade in that session; do not null or filter it. The wider no-trade-that-session population was 2,121 rows, whereas 1,635 had never traded (volume and open_interest both zero).",
"title": "Note",
"type": "string"
},
"price_basis": {
"default": "eod_settlement",
"description": "Always 'eod_settlement': 0-1 end-of-day settlement marks, not live quotes or necessarily last executions. Rothera values are end-of-day settlement marks, not live quotes or necessarily last executions. Rothera published a 0.5 placeholder on 1,600 of 2,717 measured contracts (2026-08-26): it means 'no market' only when both volume AND open_interest are zero. A 0.5 with open interest is a real mark on a contract that did not trade in that session; do not null or filter it. The wider no-trade-that-session population was 2,121 rows, whereas 1,635 had never traded (volume and open_interest both zero).",
"title": "Price Basis",
"type": "string"
},
"volume_units": {
"default": "contracts",
"description": "Always 'contracts'. Rothera volume, open interest, and trade quantities are contract quantities, never USD notional; do not compare them directly with Polymarket's identically named USD fields.",
"title": "Volume Units",
"type": "string"
}
},
"required": [
"success"
],
"title": "GetMarketHistoryResult",
"type": "object"
} # get_movers read
Rank Rothera markets by stored 7-day or 30-day EOD price change.
Full description
Rank stored Rothera price movers; it does not use direct upstream files.
| Parameter | Type | Required | Description |
|---|---|---|---|
window | "7d" | "30d" | No | Default: "7d" |
direction | "up" | "down" | "both" | No | Default: "both" |
limit | integer | No | Default: 20 |
min_samples | integer | No | Default: 1 |
min_volume | number | null | No | Minimum latest completed EOD-session contract volume. Default: 1 |
categories | array<string> | null | No | Optional canonical category filters. |
exclude_categories | array<string> | null | No | Optional canonical categories to exclude. |
query | string | null | No | Optional title/topic filter before ranking. |
status | string | null | No | Default: "active" |
Parameter schema (JSON)
{
"properties": {
"window": {
"default": "7d",
"enum": [
"7d",
"30d"
],
"title": "Window",
"type": "string"
},
"direction": {
"default": "both",
"enum": [
"up",
"down",
"both"
],
"title": "Direction",
"type": "string"
},
"limit": {
"default": 20,
"maximum": 200,
"minimum": 1,
"title": "Limit",
"type": "integer"
},
"min_samples": {
"default": 1,
"minimum": 1,
"title": "Min Samples",
"type": "integer"
},
"min_volume": {
"anyOf": [
{
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"default": 1,
"description": "Minimum latest completed EOD-session contract volume.",
"title": "Min Volume"
},
"categories": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional canonical category filters.",
"title": "Categories"
},
"exclude_categories": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional canonical categories to exclude.",
"title": "Exclude Categories"
},
"query": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional title/topic filter before ranking.",
"title": "Query"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": "active",
"title": "Status"
}
},
"title": "GetMoversParams",
"type": "object",
"additionalProperties": false
} Result schema (JSON)
{
"$defs": {
"Mover": {
"properties": {
"market_id": {
"title": "Market Id",
"type": "string"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Title"
},
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Category"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Status"
},
"samples": {
"title": "Samples",
"type": "integer"
},
"open": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Open"
},
"close": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Close"
},
"price_abs": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Price Abs"
},
"price_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Price Pct"
}
},
"required": [
"market_id",
"samples"
],
"title": "Mover",
"type": "object"
}
},
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"venue": {
"default": "rothera",
"title": "Venue",
"type": "string"
},
"is_eod": {
"default": true,
"description": "Always true: this toolkit exposes stored end-of-day data, never a live quote feed.",
"title": "Is Eod",
"type": "boolean"
},
"data_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "UTC session date (YYYY-MM-DD) of the newest observation represented by this result. Null whenever the response carries no single shared observation date, which is more than the catalogue case: catalogue, ranking and changes responses (search_markets, list_categories, get_movers, get_market_changes) never carry one; a successful but empty result (no history points) has none; and every error result leaves it null. Every write site runs its source value through the same validation, so a snapshot timestamp, the LAST history point's timestamp (the newest only insofar as the backend returns points oldest first, which this toolkit preserves rather than re-checks), or a trade-tape session_date is emitted only when it starts with a real YYYY-MM-DD calendar date; anything else, including an impossible date such as 2026-02-30, yields none rather than a value in some other shape. A null therefore means 'no shared date for this response', never 'no data behind this response'.",
"title": "Data Date"
},
"source_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Null for market-data responses: the API intentionally does not expose a raw Rothera source-file URL. Use as_of/source_url on list_contract_terms, whose data is a public directory listing.",
"title": "Source Url"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"window": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Window"
},
"direction": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Direction"
},
"movers": {
"items": {
"$ref": "#/$defs/Mover"
},
"title": "Movers",
"type": "array"
},
"count": {
"default": 0,
"title": "Count",
"type": "integer"
},
"limit": {
"default": 20,
"title": "Limit",
"type": "integer"
},
"excluded_below_min_volume": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Unavailable from the backend mover response; never fabricated by this toolkit.",
"title": "Excluded Below Min Volume"
},
"excluded_new_listings": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Unavailable from the backend mover response; never fabricated by this toolkit.",
"title": "Excluded New Listings"
},
"excluded_no_settlement": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Unavailable from the backend mover response; never fabricated by this toolkit.",
"title": "Excluded No Settlement"
},
"excluded_no_volume": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Unavailable from the backend mover response; never fabricated by this toolkit.",
"title": "Excluded No Volume"
},
"note": {
"default": "Ranks stored Rothera price changes across daily EOD snapshots. Backend movers do not expose the old raw-file exclusion counts, so every excluded_* field is null rather than estimated. Rothera values are end-of-day settlement marks, not live quotes or necessarily last executions. Rothera published a 0.5 placeholder on 1,600 of 2,717 measured contracts (2026-08-26): it means 'no market' only when both volume AND open_interest are zero. A 0.5 with open interest is a real mark on a contract that did not trade in that session; do not null or filter it. The wider no-trade-that-session population was 2,121 rows, whereas 1,635 had never traded (volume and open_interest both zero).",
"title": "Note",
"type": "string"
},
"price_basis": {
"default": "eod_settlement",
"description": "Always 'eod_settlement': 0-1 end-of-day settlement marks, not live quotes or necessarily last executions. Rothera values are end-of-day settlement marks, not live quotes or necessarily last executions. Rothera published a 0.5 placeholder on 1,600 of 2,717 measured contracts (2026-08-26): it means 'no market' only when both volume AND open_interest are zero. A 0.5 with open interest is a real mark on a contract that did not trade in that session; do not null or filter it. The wider no-trade-that-session population was 2,121 rows, whereas 1,635 had never traded (volume and open_interest both zero).",
"title": "Price Basis",
"type": "string"
},
"volume_units": {
"default": "contracts",
"description": "Always 'contracts'. Rothera volume, open interest, and trade quantities are contract quantities, never USD notional; do not compare them directly with Polymarket's identically named USD fields.",
"title": "Volume Units",
"type": "string"
}
},
"required": [
"success"
],
"title": "GetMoversResult",
"type": "object"
} # get_recent_trades read
List stored Rothera executions for one market and source-tape session.
Full description
Read retained, newest-first executions for one required Rothera symbol.
| Parameter | Type | Required | Description |
|---|---|---|---|
symbol | string | Yes | Required Rothera symbol. Stored trade tapes are market-scoped. |
session_date | string | null | No | Optional YYYY-MM-DD source-tape session; omit for this symbol's newest stored session. |
limit | integer | No | Default: 100 |
offset | integer | No | Default: 0 |
Parameter schema (JSON)
{
"properties": {
"symbol": {
"description": "Required Rothera symbol. Stored trade tapes are market-scoped.",
"minLength": 1,
"title": "Symbol",
"type": "string"
},
"session_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional YYYY-MM-DD source-tape session; omit for this symbol's newest stored session.",
"title": "Session Date"
},
"limit": {
"default": 100,
"maximum": 1000,
"minimum": 1,
"title": "Limit",
"type": "integer"
},
"offset": {
"default": 0,
"minimum": 0,
"title": "Offset",
"type": "integer"
}
},
"required": [
"symbol"
],
"title": "GetRecentTradesParams",
"type": "object",
"additionalProperties": false
} Result schema (JSON)
{
"$defs": {
"Trade": {
"properties": {
"timestamp": {
"description": "RFC3339 UTC execution timestamp.",
"title": "Timestamp",
"type": "string"
},
"price": {
"description": "Executed 0-1 probability price.",
"title": "Price",
"type": "number"
},
"quantity": {
"description": "Executed contract quantity.",
"title": "Quantity",
"type": "number"
}
},
"required": [
"timestamp",
"price",
"quantity"
],
"title": "Trade",
"type": "object"
}
},
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"venue": {
"default": "rothera",
"title": "Venue",
"type": "string"
},
"is_eod": {
"default": true,
"description": "Always true: this toolkit exposes stored end-of-day data, never a live quote feed.",
"title": "Is Eod",
"type": "boolean"
},
"data_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "UTC session date (YYYY-MM-DD) of the newest observation represented by this result. Null whenever the response carries no single shared observation date, which is more than the catalogue case: catalogue, ranking and changes responses (search_markets, list_categories, get_movers, get_market_changes) never carry one; a successful but empty result (no history points) has none; and every error result leaves it null. Every write site runs its source value through the same validation, so a snapshot timestamp, the LAST history point's timestamp (the newest only insofar as the backend returns points oldest first, which this toolkit preserves rather than re-checks), or a trade-tape session_date is emitted only when it starts with a real YYYY-MM-DD calendar date; anything else, including an impossible date such as 2026-02-30, yields none rather than a value in some other shape. A null therefore means 'no shared date for this response', never 'no data behind this response'.",
"title": "Data Date"
},
"source_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Null for market-data responses: the API intentionally does not expose a raw Rothera source-file URL. Use as_of/source_url on list_contract_terms, whose data is a public directory listing.",
"title": "Source Url"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"symbol": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Symbol"
},
"session_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Session Date"
},
"trades": {
"items": {
"$ref": "#/$defs/Trade"
},
"title": "Trades",
"type": "array"
},
"count": {
"default": 0,
"description": "Number of executions in this response's trades array, always len(trades). Rows the backend returned as non-objects, or without a timestamp, price or quantity, are dropped here, so this can be lower than the backend's own page count and summing it across pages can fall short of total.",
"title": "Count",
"type": "integer"
},
"total": {
"default": 0,
"description": "Backend count of executions it holds for this symbol and session, before this toolkit drops malformed rows. Zero on every error result and whenever the backend omits it.",
"title": "Total",
"type": "integer"
},
"has_more": {
"default": false,
"description": "The backend has further rows past this offset. It is the backend's own paging signal, unaffected by rows dropped here. False on every error result and whenever the backend omits it.",
"title": "Has More",
"type": "boolean"
},
"rows_in_file": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Rows In File"
},
"allowed_rows": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Allowed Rows"
},
"rows_malformed": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Rows Malformed"
},
"rows_ingested": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Rows Ingested"
},
"quantity_units": {
"default": "contracts",
"description": "Always 'contracts'. Rothera volume, open interest, and trade quantities are contract quantities, never USD notional; do not compare them directly with Polymarket's identically named USD fields.",
"title": "Quantity Units",
"type": "string"
},
"note": {
"default": "Stored sessions published since 2026-07-28 are retained; this is not a rolling 30-day window. Completeness fields cover the full source session. The former whole-session tape query is intentionally unavailable: symbol is required because the backend endpoint is market-scoped.",
"title": "Note",
"type": "string"
}
},
"required": [
"success"
],
"title": "GetRecentTradesResult",
"type": "object"
} # list_categories read
List stored Rothera categories and counts for search and mover filters.
Full description
List market-data's canonical Rothera category vocabulary.
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | null | No | Optional stored market status filter. Default: "active" |
raw | boolean | No | False returns canonical groups; true returns raw stored categories. Default: false |
Parameter schema (JSON)
{
"properties": {
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": "active",
"description": "Optional stored market status filter.",
"title": "Status"
},
"raw": {
"default": false,
"description": "False returns canonical groups; true returns raw stored categories.",
"title": "Raw",
"type": "boolean"
}
},
"title": "ListCategoriesParams",
"type": "object",
"additionalProperties": false
} Result schema (JSON)
{
"$defs": {
"Category": {
"properties": {
"category": {
"title": "Category",
"type": "string"
},
"market_count": {
"title": "Market Count",
"type": "integer"
}
},
"required": [
"category",
"market_count"
],
"title": "Category",
"type": "object"
}
},
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"venue": {
"default": "rothera",
"title": "Venue",
"type": "string"
},
"is_eod": {
"default": true,
"description": "Always true: this toolkit exposes stored end-of-day data, never a live quote feed.",
"title": "Is Eod",
"type": "boolean"
},
"data_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "UTC session date (YYYY-MM-DD) of the newest observation represented by this result. Null whenever the response carries no single shared observation date, which is more than the catalogue case: catalogue, ranking and changes responses (search_markets, list_categories, get_movers, get_market_changes) never carry one; a successful but empty result (no history points) has none; and every error result leaves it null. Every write site runs its source value through the same validation, so a snapshot timestamp, the LAST history point's timestamp (the newest only insofar as the backend returns points oldest first, which this toolkit preserves rather than re-checks), or a trade-tape session_date is emitted only when it starts with a real YYYY-MM-DD calendar date; anything else, including an impossible date such as 2026-02-30, yields none rather than a value in some other shape. A null therefore means 'no shared date for this response', never 'no data behind this response'.",
"title": "Data Date"
},
"source_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Null for market-data responses: the API intentionally does not expose a raw Rothera source-file URL. Use as_of/source_url on list_contract_terms, whose data is a public directory listing.",
"title": "Source Url"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Status"
},
"raw": {
"default": false,
"title": "Raw",
"type": "boolean"
},
"categories": {
"items": {
"$ref": "#/$defs/Category"
},
"title": "Categories",
"type": "array"
},
"count": {
"default": 0,
"title": "Count",
"type": "integer"
}
},
"required": [
"success"
],
"title": "ListCategoriesResult",
"type": "object"
} # list_contract_terms read
List Rothera's published contract-terms PDFs; they are not mapped to market symbols.
Full description
List raw terms documents from Rothera's public index, not market-data.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | null | No | Optional case-insensitive substring filter on the document family. |
Parameter schema (JSON)
{
"properties": {
"query": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional case-insensitive substring filter on the document family.",
"title": "Query"
}
},
"title": "ListContractTermsParams",
"type": "object",
"additionalProperties": false
} Result schema (JSON)
{
"$defs": {
"ContractTermsEntry": {
"properties": {
"family": {
"title": "Family",
"type": "string"
},
"url": {
"title": "Url",
"type": "string"
}
},
"required": [
"family",
"url"
],
"title": "ContractTermsEntry",
"type": "object"
}
},
"properties": {
"success": {
"default": true,
"title": "Success",
"type": "boolean"
},
"venue": {
"default": "rothera",
"title": "Venue",
"type": "string"
},
"terms": {
"items": {
"$ref": "#/$defs/ContractTermsEntry"
},
"title": "Terms",
"type": "array"
},
"count": {
"default": 0,
"title": "Count",
"type": "integer"
},
"as_of": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "As Of"
},
"source_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Source Url"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
}
},
"title": "ListContractTermsResult",
"type": "object"
} # search_markets read
Search supported Rothera EOD markets by human-readable title.
Full description
Search the canonical stored Rothera title index. An empty result is valid.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Yes | Words to match in stored human-readable titles. |
categories | array<string> | null | No | Optional canonical category filters. |
status | string | null | No | Stored market status; pass null to include all. Default: "active" |
limit | integer | No | Default: 20 |
Parameter schema (JSON)
{
"properties": {
"query": {
"description": "Words to match in stored human-readable titles.",
"maxLength": 200,
"minLength": 1,
"title": "Query",
"type": "string"
},
"categories": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional canonical category filters.",
"title": "Categories"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": "active",
"description": "Stored market status; pass null to include all.",
"title": "Status"
},
"limit": {
"default": 20,
"maximum": 200,
"minimum": 1,
"title": "Limit",
"type": "integer"
}
},
"required": [
"query"
],
"title": "SearchMarketsParams",
"type": "object",
"additionalProperties": false
} Result schema (JSON)
{
"$defs": {
"MarketSummary": {
"properties": {
"market_id": {
"description": "Rothera contract symbol for every market-scoped tool.",
"title": "Market Id",
"type": "string"
},
"title": {
"description": "Toolforest's stored human-readable title.",
"title": "Title",
"type": "string"
},
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Category"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Status"
}
},
"required": [
"market_id",
"title"
],
"title": "MarketSummary",
"type": "object"
}
},
"properties": {
"success": {
"title": "Success",
"type": "boolean"
},
"venue": {
"default": "rothera",
"title": "Venue",
"type": "string"
},
"is_eod": {
"default": true,
"description": "Always true: this toolkit exposes stored end-of-day data, never a live quote feed.",
"title": "Is Eod",
"type": "boolean"
},
"data_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "UTC session date (YYYY-MM-DD) of the newest observation represented by this result. Null whenever the response carries no single shared observation date, which is more than the catalogue case: catalogue, ranking and changes responses (search_markets, list_categories, get_movers, get_market_changes) never carry one; a successful but empty result (no history points) has none; and every error result leaves it null. Every write site runs its source value through the same validation, so a snapshot timestamp, the LAST history point's timestamp (the newest only insofar as the backend returns points oldest first, which this toolkit preserves rather than re-checks), or a trade-tape session_date is emitted only when it starts with a real YYYY-MM-DD calendar date; anything else, including an impossible date such as 2026-02-30, yields none rather than a value in some other shape. A null therefore means 'no shared date for this response', never 'no data behind this response'.",
"title": "Data Date"
},
"source_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Null for market-data responses: the API intentionally does not expose a raw Rothera source-file URL. Use as_of/source_url on list_contract_terms, whose data is a public directory listing.",
"title": "Source Url"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error"
},
"query": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Query"
},
"markets": {
"items": {
"$ref": "#/$defs/MarketSummary"
},
"title": "Markets",
"type": "array"
},
"count": {
"default": 0,
"title": "Count",
"type": "integer"
},
"limit": {
"default": 20,
"title": "Limit",
"type": "integer"
},
"note": {
"default": "Search is over Toolforest titles for supported non-sports Rothera EOD markets, not the raw venue catalogue.",
"title": "Note",
"type": "string"
},
"price_basis": {
"default": "eod_settlement",
"description": "Always 'eod_settlement': 0-1 end-of-day settlement marks, not live quotes or necessarily last executions. Rothera values are end-of-day settlement marks, not live quotes or necessarily last executions. Rothera published a 0.5 placeholder on 1,600 of 2,717 measured contracts (2026-08-26): it means 'no market' only when both volume AND open_interest are zero. A 0.5 with open interest is a real mark on a contract that did not trade in that session; do not null or filter it. The wider no-trade-that-session population was 2,121 rows, whereas 1,635 had never traded (volume and open_interest both zero).",
"title": "Price Basis",
"type": "string"
},
"volume_units": {
"default": "contracts",
"description": "Always 'contracts'. Rothera volume, open interest, and trade quantities are contract quantities, never USD notional; do not compare them directly with Polymarket's identically named USD fields.",
"title": "Volume Units",
"type": "string"
}
},
"required": [
"success"
],
"title": "SearchMarketsResult",
"type": "object"
}