New API and MCP hosts
- REST moves to
https://api.centaur.io/v1andhttps://api.centaur.io/v2, and MCP moves tohttps://mcp.centaur.io/mcp. Endpoints, responses and REST API keys are unchanged. MCP clients reconnect to the new URL and may need to sign in again. - The OpenAPI documents list the versioned base URL as their server, so operation paths no longer carry the version prefix.
partners.centaur.iokeeps serving for one month after launch. See Migrating from partners.centaur.io.
Server time anchor in response meta
- Every list and stats response (REST and the matching MCP tool results) now includes
meta.serverTime: the server’s UTC time when the response was produced, as an ISO-8601 string. Existing response fields are unchanged. - Use
meta.serverTimefrom your most recent response as the anchor when resolving relative-time phrases such as “today”, “this week”, or “last 7 days” into explicitstartTimeandendTimevalues. When the server applies a default history window,appliedTimeRange.endTimeis taken from the same request clock and matchesserverTimeto within a few milliseconds. - The
filter-guideMCP resource no longer embeds a timestamp of its own. Hosts commonly cache resource reads for a whole session, so the guide now directs callers tometa.serverTimefirst and to their own clock only before the first tool result.
Ranking window defaults, validation, and coverage
- Trader rankings now default an omitted sample to UTC year-to-date and an omitted performance evaluation window to
30D. Explicit values remain unchanged. - Structurally invalid REST sample and evaluation combinations return
422with requested and resolved values plus valid retry alternatives. MCP returns a tool error with the same structured details. Neither interface substitutes or retries automatically. - Performance ranking and trader stats responses now expose sampled and scored position counts plus their coverage ratio. Partial coverage remains valid when the normal minimum scored-position requirement is met.
Trader tags on trader stats
- Trader stats rows (
GET /api/v1/traders/statsand thelist_trader_statsMCP tool) now includetags: editorial trader tags as{ category, name }pairs, lowercase, e.g.{ "category": "thematic", "name": "ai capex buildout" }. - The first shipped category is
thematic: which macro themes a trader’s book expresses (AI capex buildout, power and energy, critical metals and minerals, robotics, macro rotations, crypto). Categories are an open set and may grow without a version bump. tagsis always present and empty for untagged traders. Tag visibility follows the same trader visibility rules as the rest of the stats row.
Partner Feed
- Added
GET /api/v1/feedand thelist_feedMCP tool: presentation-ready source-message groups that embed the source preview, source identity, trader, and asset display fields needed for direct rendering, ordered by source-message post time. - Server-side curation removes fabricated events with no message evidence: assumed and GC-generated closes, instant opens fabricated at a position’s close, and assumed opens siblinged with another event for the same message and asset. Lone inferred opens remain visible with
assumed: true, and retrospective events remain flagged withretrospective: true. limitcounts source-message groups (default20, maximum100).traderIdsandassetIdsfilters plusstartTime/endTimebounds select groups by source-message post time.cursorscrolls back through older groups.sinceis an ingestion-watermark change feed with whole-group upsert semantics: merge returned groups byidand replace each prior payload. The two parameters are mutually exclusive; persist the newest non-nullnextCursorafter every successful poll, including empty polls.- The feed uses the new
feed.readscope on REST API keys and MCP OAuth connections. MCP connections authorized before the scope existed need one disconnect and reconnect to pick it up; API keys are unaffected. - Added the Partner Feed guide and updated query-semantics, data-reads, and MCP docs for the new read family.
Trader rankings and activity summaries
- Added
GET /api/v1/traders/rankingsand therank_tradersMCP tool: server-side trader ranking byevent_count(default),position_count,win_rate,avg_return,median_return, orsharpe_ratioover an explicit UTC time window, without supplying trader IDs. - Performance-metric rankings evaluate the
timeBasedPerformanceWindow(default7D) and requireminPositionsevaluated positions (default 3); rows expose the evaluated sample size. Windows whosestartTimeis more recent than the evaluation window are rejected with a corrective422instead of returning a silent empty ranking. - Added
GET /api/v1/activity-summariesand thesummarize_message_activityMCP tool: deterministic message and event counts grouped by trader or overall, bucketed by hour, day, or week. Activity summaries are count evidence, not generated narrative summaries. - Both reads use the
stats.readscope, default to the last 7 days, and return small bounded results (default limit 10, maximum 50) with no pagination. Activity summary requests above 168 buckets per group are rejected with422. - Updated MCP capabilities and filter-guide resources so ranking, count, and trend prompts route to the aggregate tools instead of paging
list_events/list_messages.
Trader discovery trade counts
- Trader discovery rows now include
tradeCount, the eligible visible position count for the discovery result. GET /api/v1/tradersandlist_tradersnow acceptminTrades, defaulting to3; passminTrades=0for the full visible trader directory.- Trader discovery now accepts
startTimeandendTimeto scopetradeCountandminTradesby position open time. - Updated REST, MCP, and platform docs to identify trader discovery as the supported source for discovery-level activity counts.
Source-aware payloads
- Message rows now expose source metadata under
source.identityand message display data undersource.preview. - The old flat message
url,text,attachments, andoriginalCreatedAtfields were replaced by the nested source payload. source.platformcan beTELEGRAMorX, enabling platform-specific links, labels, avatars, and audience counts.GET /api/v1/messages,list_messages, and delegated chat assistant message reads now acceptsourcePlatformsfor Telegram-only or X-only message feeds.- Trader discovery and trader stats rows now include one
sourceidentity, and their reads acceptsourcePlatforms.
Opaque Source Message IDs and X-backed message reads
- Source Message IDs are now opaque identifiers returned by source-message views, not Telegram channel/message tuples.
GET /api/v1/messages,list_messages, and eventmessageIdhydration use those opaque IDs throughids.- Source-message URLs may point to Telegram or X depending on the source platform.
Product and contract documentation refresh
- Replaced the old Arena product page with current product-surface docs for Trader Discovery, Asset Discovery, Feed, Following, profiles, Assistant, and source transparency.
- Added API-key, Connected Apps, and contract-limit guides for REST, MCP, and agent clients.
- Clarified messages vs events vs positions, positioning vs performance, event classification flags, and time-based performance windows.
- Updated REST docs to list generated channel and aggregate summary endpoints as first-class read families.
Event and message contract compaction
- Event rows now return flat
type,positionId, andmessageIdfields instead ofeventType, nestedposition, or nestedsource. - Event reads now filter event kinds with
types. - Message reads now hydrate Source Message IDs with
idsand no longer exposetraderIdor event-derived filters.
Generated narrative summary guidance
- Clarified MCP and docs language for channel and aggregate summaries as generated narrative summaries.
- Added guidance that generated narrative summaries are useful for market narratives but are not evidence for exact trade counts, public activity rankings, or current open-position skew.
- Clarified that current positioning claims should use open-position reads.
Position History Reads
- Replaced
GET /api/v1/positions/closed/validandlist_valid_closed_positionswithGET /api/v1/positionsandlist_positions. - Position history reads return open and closed positions by open time with
1D,7D, and30Dtime-based performance. - Open-position reads continue to expose current marks and live mark-to-market returns.
Centaur API naming
- Updated user-facing copy to use “Centaur API” and “Centaur MCP”.
- Updated examples to use a generic
<api-key>placeholder.
Trader-attributed channel summaries
- Added top-level
traderIdtoGET /api/v1/channel-summariesandlist_channel_summariesresults so clients can connect summaries from the same trader over time. - Channel summaries still do not accept trader or Telegram channel filters, and they do not return trader metadata, channel identity, or raw source material.
- Generated aggregate summaries remain source-anonymous and unchanged.
Summary access
- Removed the separate Summary Entitlement row-returning gate from generated channel and aggregate summaries.
- Summary reads still require
summaries.readauthorization through REST API-key permissions or MCP OAuth scopes. - New default Centaur API keys include
summaries.read.
Generated aggregate narrative summaries
- Added
GET /api/v1/aggregate-summariesandlist_aggregate_summariesfor cross-source generated aggregate narrative summaries. - Aggregate summaries use
summaries.read, support Source Window-style overlap filtering, and default tosafesummaries. - Public responses expose source coverage counts but not trader or channel identities.
MCP OAuth eligibility
- Changed MCP OAuth eligibility from existing active API-key ownership to an active Centaur account with a verified email.
- REST remains API-key based, and generated summaries require normal
summaries.readauthorization. - Runtime reads now reject API-key and OAuth owners whose Core account later becomes blocked or unverified.
Source Window overlap filtering
- Changed
GET /api/v1/channel-summariesandlist_channel_summariessostartTimeandendTimeselect summaries whose Source Windows overlap the requested interval. - A Source Window now matches when
windowEndis afterstartTimeandwindowStartis beforeendTime. - This fixes daily summary reads so UTC day bounds return summaries covering that day instead of summaries selected only by their window end timestamp.
Documentation and client guidance
- Updated the OpenAPI descriptions, REST docs, MCP filter guide, and public skill guidance to describe Source Window overlap semantics.
Messages now default to feed semantics
- Changed
GET /api/v1/messagesandlist_messagesto return eligible messages even when they have no linked extracted events. - Kept
assetIds,directions, andeventTypesas filters that narrow messages through linked events when supplied. - Superseded on 2026-06-13: message reads now support Source Message ID hydration with
idsplus time bounds,limit, andcursor; trader, asset, direction, and event-type filters are no longer part of the public message contract.
Documentation and MCP guidance
- Clarified the new message-feed behavior in the public docs, generated API reference, and MCP filter guidance resource.
- Kept the response shape and pagination contract unchanged.
Broader read surface
- Expanded the documented and generated REST surface beyond events to cover messages, positions, and stats under
/api/v1. - Expanded the documented MCP surface to cover the same read-only trading data families across events, messages, generated summaries, positions, discovery, and stats.
Query and pagination updates
- Removed
allTimefrom the public date-range contract. Time-bounded reads now usestartTimeandendTime. - Standardized list-style reads on forward-only cursor pagination and documented the applied time bounds echoed back in relevant responses.
Access and authentication behavior
- Clarified that returned data can reflect current access and eligibility rules, so visible rows and available history can vary by caller context.
- Hardened event pagination so paging remains stable even as the currently visible result set changes.
Documentation and client guidance
- Reframed the docs around a broader read-only trading data surface instead of an events-only product view.
- Added a data-reads guide, aligned public skill guidance, and refreshed client setup docs to match the expanded REST and MCP surface.
Task-first onboarding
- Reworked the homepage around access, path selection, and quickstarts for both REST and MCP.
- Added concrete MCP setup guides for Claude Code, Cursor, and Codex.
API reference improvements
- Strengthened the generated OpenAPI-backed reference with richer examples and schema descriptions.
- Kept Swagger available as a secondary technical artifact rather than the primary docs surface.
Information architecture
- Reworked the MCP/API docs around task guides, generated API reference, and changelog pages.
- Moved public skills into a more clearly supplemental role within the docs.