Contract
{
"type": "object",
"required": [
"address"
],
"properties": {
"to": {
"type": "string",
"minLength": 1,
"description": "Window end (Unix seconds or a date), inclusive. Defaults to now. With order=desc, page back within the most-recent results by setting this to the oldest time you received (prefer to_ms for millisecond precision); with order=asc it bounds the walk. Example: 2026-03-01."
},
"from": {
"type": "string",
"minLength": 1,
"description": "Window start (Unix seconds or a date). With the default order=desc, results cover the window forward from this point and are capped at ~2000 of the earliest fills in range (narrow the range to see the most-recent fills). With order=asc this is the start of a complete-history walk: follow meta.next_cursor to page through every fill in the window with no cap. Example: 2026-03-01."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Page size (1-100). Defaults to 20."
},
"order": {
"enum": [
"desc",
"asc"
],
"type": "string",
"default": "desc",
"description": "desc (default): newest first — the recent feed, or the earliest-anchored ~2000-fill slice when from is set. asc: oldest first, a complete-history walk from from (required) up to to — each page links the next via meta.next_cursor with no result cap, the reliable mode for full trade-history or PnL reconstruction. Defaults to \"desc\"."
},
"to_ms": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Window end in Unix milliseconds, for millisecond-precise desc paging: pass the time_ms of the oldest fill you received to fetch the next page. On its own the boundary is exclusive (fills AT to_ms are dropped), so when more than limit fills share one millisecond the remainder is skipped — pair it with to_fill_id to page losslessly through a boundary millisecond. Takes precedence over to (which is ignored when to_ms is set). Like to, it pages within the recent (~2000-fill) window. desc-only: rejected with order=asc (use cursor instead)."
},
"cursor": {
"type": "string",
"minLength": 1,
"description": "Opaque continuation token from a previous response's meta.next_cursor. It encodes the paging direction, position, and window, so pass it with only symbol and limit — combining it with from, to, to_ms, or to_fill_id is rejected with 400."
},
"symbol": {
"type": "string",
"minLength": 1,
"description": "Filter to one market (exact match, e.g. xyz:GOLD). Applied client-side: with order=desc it filters after the recent cap (pair it with from/to so older fills are not missed); with order=asc the cursor walk scans past non-matching fills, so a page may return fewer than limit items (or none) while meta.next_cursor still advances."
},
"address": {
"type": "string",
"minLength": 1,
"description": "Wallet address: a 0x EVM address or an ENS name (e.g. vitalik.eth). Solana addresses are not supported."
},
"to_fill_id": {
"type": "string",
"minLength": 1,
"description": "Cursor tiebreak for to_ms: pass the fill_id of the oldest fill you received alongside its time_ms as to_ms. The next page then resumes strictly after that (time_ms, fill_id) pair — fills at the boundary millisecond with a lower fill_id are included instead of skipped, so paging never loses fills that share a millisecond. Requires to_ms; desc-only. Equivalent to following meta.next_cursor, which encodes the same position. An empty page can mean the window is exhausted (set from to reach older history), not that no older fills exist."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fee": {
"type": "number",
"description": "Fee charged (or, when negative, the maker credit paid out) in fee_token. On the populated real fixture every crossed=false fill had a negative fee and every crossed=true fill had a positive one."
},
"hash": {
"type": "string",
"description": "On-chain transaction hash for this fill, 0x-prefixed."
},
"side": {
"type": "string",
"description": "'buy' or 'sell'."
},
"size": {
"type": "number"
},
"time": {
"type": "integer",
"description": "Fill time, Unix seconds."
},
"price": {
"type": "number"
},
"symbol": {
"type": "string",
"description": "Market id, e.g. ETH."
},
"crossed": {
"type": "boolean",
"description": "true = a taker fill that took liquidity from the book."
},
"fill_id": {
"type": "string",
"description": "The exchange's numeric identifier for this fill (a public on-chain record id, not personal data); the to_fill_id cursor tiebreak refers to this value."
},
"time_ms": {
"type": "integer",
"description": "Fill time, Unix milliseconds."
},
"tx_index": {
"type": "integer"
},
"direction": {
"type": "string",
"description": "Trade-direction label, e.g. 'Close Long'."
},
"fee_token": {
"type": "string",
"description": "Token the fee is denominated in, e.g. USDC."
},
"closed_pnl": {
"type": "number",
"description": "Realized PnL booked by this closing fill; negative is a loss."
},
"is_internal": {
"type": "boolean",
"description": "Whether the fill was internal to the exchange."
},
"start_position": {
"type": "number",
"description": "Position size held before this fill executed."
}
},
"additionalProperties": false
},
"description": "One entry per individual fill, newest first under the default order. Honestly EMPTY on two of this tool's real fixtures (an address with no fills on record) -- see meta.empty_reason."
},
"meta": {
"type": "object",
"properties": {
"limit": {
"type": "integer"
},
"cached": {
"type": "boolean"
},
"has_more": {
"type": "boolean"
},
"next_cursor": {
"type": "string",
"description": "Opaque continuation token for the next page. Present only when has_more is true; pass it back as the `cursor` input (with only symbol and limit) to fetch the next page."
},
"empty_reason": {
"type": "string",
"description": "Only present on an empty result, e.g. 'no fills on record for this address'."
}
},
"description": "Paging metadata. On an empty result this carries `empty_reason`; on a page with more results it carries `next_cursor`; `has_more`/`limit`/`cached` are present in both shapes.",
"additionalProperties": false
}
},
"description": "The fills response, as returned at routing.responseResultPath ($.output) after this tool's own responseShaping allowlist.",
"additionalProperties": false
}Pricing
Every real charge, itemised. A model that quietly omits one is a slow financial leak, so nothing here is rolled up, and a charge that only applies to some inputs says so rather than being added in.
Prices in this catalog are the provider's own list price, not your bill: Omnial MCP charges provider cost plus a platform markup on top, so what you are charged is higher than the figure shown. For the exact amount a specific call will cost, run omnial_execute with dry_run: true; that number includes the markup and is what we hold while the call runs. It is a quote, not a cap on the charge.
| Charge | Rate |
|---|---|
Per call Flat, regardless of what comes back | $0.03276 |
- Cost basis
- Not recorded
This tool's catalog entry does not record how its final bill is determined, so we will not tell you whether its cost is fixed before the call or reported by the provider afterwards. Either way what is held is a quote rather than a cap: you are charged what the call actually costs, bounded at 2x the quote.
- Updated
- Sep 25, 2026
