---
title: "Read one trade by id"
method: GET
path: "/trades/{tradeId}"
tags: ["Trade"]
---

# Read one trade by id

`GET /trades/{tradeId}`

## Request

- Base URL: `https://kellian.app/api/v1`
- URL: `https://kellian.app/api/v1/trades/{tradeId}`
- Auth: none required

## Path parameters

- `tradeId` string, required

## Response `200`

Success

- PublicTradeRecord: One trade, addressable by id. The same facts the market's public trade feed carries, plus where the trade is recorded on Base.
  - `id` string, required: Stable identifier for this trade; the shareable coordinate.
  - `chainId` integer, required: Compiled protocol release chain ID (Base 8453).
  - `marketAddress` string, required: Checksummed or lowercase 20-byte EVM address (0x + 40 hex).
  - `marketQuestion` string, nullable, required
  - `marketSlug` string, nullable, required
  - `settlement` 'onchain' | 'committed', required: Which engine settles this market's fills. `onchain` = the market contract holds collateral and outcome tokens, and every fill is its own Base transaction. `committed` = the venue's commit ledger holds them, a fill is paid the instant it matches, and fills are published to Base in batches as standard ERC-1155 transfers under a chained Merkle root — so a trade is recorded on Base a short time after it happens rather than at the moment it happens. Immutable per market, decided by the market's collateral.
  - `outcomeIndex` integer, required: 0-indexed outcome this trade is in.
  - `outcomeLabel` string, nullable, required
  - `direction` 'buy' | 'sell', required
  - `shares` string, required: Outcome tokens moved, in the market collateral's smallest unit.
  - `priceBps` integer, required: Execution price for this outcome, in basis points of one collateral unit.
  - `occurredAt` string, date-time, required
  - `settlementState` 'pending' | 'committed' | 'finalized', required: State of this fill's RECORD on Base — never a claim about whether it was paid, which happens before this field exists on either engine. `pending` (committed markets only) = paid on the venue ledger and waiting for the next batch, so there is no transaction yet. `committed` = the transaction carrying it is mined. `finalized` = that block is final. On `onchain` markets the value tracks the fill's own transaction and is never `pending`.
  - `batchNonce` string, nullable, required
  - `batchTxHash` string, nullable, required
  - `txHash` string, nullable, required
  - `recordedOn` RecordedOn: Explorer links for this fill, derived from the chain's configured explorer. Fields are omitted rather than nulled when there is nothing to link to.
    - `explorer` string, required: Explorer this venue links to for the market's chain, e.g. `basescan`.
    - `txUrl` string, uri: The transaction that carries this fill: the batch transaction on a committed market, the fill's own transaction on an on-chain one. Absent while a committed fill is still `pending`.
    - `addressTransfersUrl` string, uri: The holder's token-transfer tab on the explorer. Present only on on-chain markets, where a fill is an ERC-1155 transfer. Absent on committed markets: their fills are published inside a journal batch (`batchTxHash`), not as per-holder transfers — use `verifyUrl`.
    - `verifyUrl` string, uri: This venue's public verification page for the batch that carries this fill: it decodes the batch from Base in the browser and highlights the holder. Present on committed fills once their batch is mined.

## Other responses

- `400`: Error: one of INVALID_QUERY
- `404`: Error: one of NOT_FOUND
- `500`: Error: one of INTERNAL_ERROR
- `default`: Error response (RFC 9457 Problem Details for HTTP APIs)

---

[API](https://skmtc.dev/problee/apis/kellian-consumer-api.md) · [All operations](https://skmtc.dev/problee/apis/kellian-consumer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/problee/apis/kellian-consumer-api/revisions/ae0533ad5012?raw)
