Response envelope
Every REST success has the same outer shape:data.meta differs by read:
Stats, rankings, and activity summaries also return
data.filtersApplied, which holds their applied time bounds in appliedTimeRange.
Errors use this envelope:
requestId when you contact support. MCP tools return the same results, meta, and filtersApplied as structured content, and report errors through the MCP response model instead of this envelope.
Server time
Every list and stats response includesmeta.serverTime, the server’s UTC time when it produced the response, as an ISO-8601 string. Resolve relative phrases such as “today” or “last 7 days” into explicit startTime and endTime from this value, not from a clock you cached earlier. When the server applies a default window, appliedTimeRange.endTime comes from the same clock and matches serverTime within a few milliseconds.
Trader and asset identifiers
Numeric IDs and text references are separate parameters:
REST accepts comma-separated values or repeated parameters. These requests are the same:
{"assetRefs": ["AAPL", "crypto-btc", "700"]}, {"assetIds": [34, 700]}, or {"traderRefs": ["alpha-trades"]}.
- A reference is always text.
assetRefs=700looks for the slug, ticker, or symbol700. It never selects asset ID700. MCP reference arrays reject numbers, so{"assetRefs": [700]}is invalid. Entities without a slug can still be selected by ID. - Use one form per entity.
assetIdsandassetRefsare mutually exclusive, as aretraderIdsandtraderRefs, even when one is empty. Each entity is independent, so{"traderIds": [7], "assetRefs": ["crypto-btc"]}is valid. - Up to 200 entries per field. Entries are counted after splitting commas and trimming whitespace, duplicates included. A field with 201 entries fails validation, REST with
422and MCP with an input error. Nothing runs and the list is never truncated. - Matching is case-insensitive. Asset lookup tries slug, then ticker, then legacy symbol. An ambiguous match at one step fails instead of falling through to the next.
- An ambiguous reference rejects the request with
422AMBIGUOUS_IDENTIFIERand the candidates. See Ambiguous identifiers. - An unknown reference matches nothing. Other references in the list still apply. If none match, the filter matches nothing. It never widens to all entities.
- Names and handles are search inputs, not references. Use the
searchparameter of the trader directory or asset discovery, which can return several matches.
filtersApplied are always numeric.
Filters
Multi-value filters such astraderIds, assetIds, directions, event types, and message ids take comma-separated values or repeated parameters in REST, and arrays in MCP. Values within a filter match any of them. Different filters intersect.
Some rows are left out without a placeholder: deleted rows, rows tied to ineligible entities, and rows outside your access. A response that looks narrower than expected may reflect this or the applied time bounds.
Pagination
List reads page forward withlimit and cursor:
limitaccepts up to200. The partner feed counts source-message groups instead: default20, maximum100.- Pass
meta.nextCursorascursorto get the next page. Pagination only moves forward. - A cursor stays valid if matching rows disappear between requests. Those rows are missing from later pages.
- Pages reflect the current eligible rows, not a frozen snapshot.
- When
meta.hasMoreistrue, the result is partial. Fetch more pages, or say the answer is partial.
since for change polling. cursor and since cannot be combined. A feed response can return a nextCursor while hasMore is false, so that token can become the next since.
Time ranges
Feed, events, messages, positions, and generated summaries acceptstartTime and endTime:
- With both omitted, the server can apply a bounded default window.
- An explicit
startTimebefore the accessible range can be moved forward. meta.appliedTimeRangereports the bounds the server used.
Open positions take no time bounds.
Stats reads
Trader stats need exactly one non-emptytraderIds or traderRefs. Asset stats need exactly one non-empty assetIds or assetRefs. Neither, both, or an empty selection fails validation. Other filters are optional and follow the same one-form-per-entity rule.
Stats remove duplicate selections after validation and return results in the order first requested. Several references that resolve to one entity produce one result.
meta.requestedTraderIds, meta.requestedAssetIds, meta.missingTraderIds, and meta.missingAssetIds always contain numbers. For a reference request, requested IDs are the distinct resolved IDs, and missing IDs are resolved IDs with no stats.
A reference request also returns meta.requestedTraderRefs and meta.missingTraderRefs, or the asset equivalents. They contain the references as you spelled them, trimmed and with exact duplicates removed. An unknown reference appears in the missing references without a missing ID, because it has no ID. A reference that resolves to an entity with no stats appears in both lists.
Ordering
Each read has a fixed order. There is no sort parameter.- Events, messages, the feed, positions, open positions, and generated summaries return the newest first. Feed groups sort by source post time, then Source Message ID. Events in a group sort by event time, then event ID.
- The trader directory, trader activity, and legacy trader discovery sort by name, case-insensitive, then
id. - Asset discovery sorts by
symbol, case-insensitive, thenid. - Trader rankings sort by the requested metric, highest first.
- Activity summaries sort buckets by start time within each group, oldest first.
Prices
Prices are in the quote currency of the asset’s preferred market, given in the nullablequoteSymbol field on position and event rows, such as USDT, USDC, or CAD. Do not assume US dollars. quoteSymbol reflects the asset’s current preferred market, not the market the trade executed on, so treat it as the display currency for the row’s prices.
Open-position rows include current marks when pricing is available. Marks are best effort for the request, not audited settlement prices, and have no separate priceAsOf timestamp.