Markets
Sentico supports spot instruments and outcome markets. The authoritative market catalog and trading rules come from:
GET https://api.sentico-labs.xyz/api/v1/public/markets
GET https://api.sentico-labs.xyz/api/v1/public/exchange-info
/public/markets returns { items: [...], featuredMarketId }; each item
carries marketId, symbol, marketType (spot, binary_option,
prediction), status, tickSizeMicro, lotSizeMicro, priceDecimals,
instrumentConfig (base/quote or collateral asset, minNotionalMicro,
oracleBinding, maxPriceMicro), resolutionPolicy, expiryTsMs and
rules, plus maxOrderQtyMicro where a market sets one.
/public/exchange-info is the compact trading-rules view (microsScale,
tick, lot and minimum notional per symbol).
Order limits on the market item
| Field | Carried by | Meaning |
|---|---|---|
instrumentConfig.maxPriceMicro | binary_option items only | Highest limit price in micro-USDC per share. A binary market definition is only accepted with exactly 1000000 (1.000 USDC). |
maxOrderQtyMicro (top level of the item, not inside instrumentConfig) | Only markets that set a per-order quantity cap; absent means no per-order cap | Largest qty of one order, in the same micro units as qty. A larger order is rejected with qty_exceeds_max. |
Readback 2026-09-23: markets 1, 17 and 22–35 (binary options) carry
maxPriceMicro: 1000000; prediction markets 9–13 carry
maxOrderQtyMicro: 250000000 (250 shares per order) and the internal test
markets 6–8 carry 500000; no spot or binary market carried
maxOrderQtyMicro.
The 1.000 price cap applies to every outcome market, including prediction
markets that do not publish maxPriceMicro. The engine checks it for all
YES/NO books (binary option and prediction) on limit orders: a price above
1000000 is rejected, 1000000 itself is accepted, and the price must be
greater than zero (price_must_be_positive). Because 1.000 is a multiple of
the 1000-micro tick, the highest valid outcome limit price is 1000000 and the
lowest is 1000. Keep the price field of outcome market orders at or below
1000000 as well: the engine check skips market orders, but the sequencer
pre-check applied to outcome PlaceOrder actions does not. The reject has no
dedicated code yet; see
Order Types.
Do not hardcode market IDs, tick sizes, lot sizes, or lifecycle state from this page. Resolve them at startup and refresh them after reconnects or configuration changes.
Live private-beta snapshot (2026-09-23)
The public catalog contained these markets on 2026-09-23 (read from
GET /api/v1/public/markets; internal test markets listed separately below).
Expiry times are UTC and come from expiryTsMs.
Spot
| Market ID | Symbol | Status | Tick / lot (micro) | Min notional (micro) |
|---|---|---|---|---|
| 2 | SPOT:USDC/USDT | open | 100 / 1 | 1 |
| 3 | SPOT:ETH/USDC (base asset WETH) | open | 100 / 1 | 1 |
| 4 | SPOT:CKT/USDC | open | 100 / 1 | 1 |
| 5 | SPOT:TCO/USDC | open | 100 / 1 | 1 |
| 14 | SPOT:BTC/USDC (base asset WBTC, 8 decimals) | open | 10000 / 1 | 1000000 |
| 15 | SPOT:ARB/USDC | open | 100 / 1000 | 1000000 |
| 21 | FYT/USDC (1 lot = 1 whole FYT) | open | 1 / 1000000 | 1000000 |
| 20 | SPOT:FYT/USDC | scheduled | duplicate of 21; do not quote it |
Binary options (YES/NO books, USDC collateral, tick 1000, lot 1,
maxPriceMicro: 1000000)
| Market ID | Symbol | Oracle binding | Status | Expiry (UTC) |
|---|---|---|---|---|
| 1 | BO:BTC-100k-1-1-27 | V1 price_barrier_v1 | open | 2027-01-01 04:59:59 |
| 17 | BO:BTC-USD-20260913-1789304400000-V2 | V2 canonical_v2 | resolved_no | 2026-09-13 13:00 |
| 22 | BO:BTC-USD-20261003-1791043200000-V2 | V2 canonical_v2 | open | 2026-10-03 16:00 |
| 23 | BO:ETH-USD-20261004-1791136800000-V2 | V2 canonical_v2 | open | 2026-10-04 18:00 |
| 24 | BO:SOL-USD-20261005-1791208800000-V2 | V2 canonical_v2 | open | 2026-10-05 14:00 |
| 25 | BO:BNB-USD-20261006-1791302400000-V2 | V2 canonical_v2 | open | 2026-10-06 16:00 |
| 26 | BO:HYPE-USD-20261007-1791399600000-V2 | V2 canonical_v2 | open | 2026-10-07 19:00 |
| 27 | BO:XRP-USD-20261008-1791478800000-V2 | V2 canonical_v2 | open | 2026-10-08 17:00 |
| 28 | BO:ZEC-USD-20261009-1791568800000-V2 | V2 canonical_v2 | open | 2026-10-09 18:00 |
| 29 | BO:LINK-USD-20261010-1791648000000-V2 | V2 canonical_v2 | open | 2026-10-10 16:00 |
| 30 | BO:XAU-PERP-USD-20261013-1791903600000-V2 | V2 canonical_v2 | open | 2026-10-13 15:00 |
| 31 | BO:XAG-PERP-USD-20261014-1791986400000-V2 | V2 canonical_v2 | open | 2026-10-14 14:00 |
| 32 | BO:TSLA-PERP-USD-20261106-1793984400000-V2 | V2 canonical_v2 | open | 2026-11-06 17:00 |
| 33 | BO:META-PERP-USD-20261113-1794589200000-V2 | V2 canonical_v2 | open | 2026-11-13 17:00 |
| 34 | BO:PLTR-PERP-USD-20261118-1795021200000-V2 | V2 canonical_v2 | open | 2026-11-18 17:00 |
| 35 | BO:NVDA-PERP-USD-20261203-1796317200000-V2 | V2 canonical_v2 | open | 2026-12-03 17:00 |
The strike of each binary option is in strike and its question in
question / rules on the market item; the millisecond number in the V2
symbol is the expiry.
Prediction markets (economic_dispute, tick 1000, lot 1000,
maxOrderQtyMicro: 250000000)
| Market ID | Symbol | Status | Expiry (UTC) |
|---|---|---|---|
| 9 | PM:ALCARAZ-USO-PLAY-2026 | resolved_yes | 2026-08-30 |
| 10 | PM:ALCARAZ-USO-FINAL-2026 | resolved_no | 2026-09-11 |
| 11 | PM:ECB-RATES-UNCH-20260910 | resolved_no | 2026-09-10 |
| 12 | PM:MOURINHO-RMA-2026-27 | open | 2027-05-01 |
| 13 | PM:SPT-MCAP-50M-20270401 | open | 2027-04-01 |
Markets 6–8 are resolved internal test markets (PRED:TEST-*,
resolved_yes / resolved_no) and markets 16, 18 and 19 were internal
Oracle V2 canaries (closed, resolved_invalid, resolved_no). They remain
in the catalog; do not quote them. Resolved markets also stay in the catalog:
a quote engine must skip every market whose status is not open and every
market whose expiryTsMs has passed, and re-check both periodically while it
runs, not only at startup.
The endpoint response overrides this dated snapshot. A market being present in
the catalog does not by itself prove placement readiness; also require
GET /api/v1/readiness to return HTTP 200 and GET /api/v1/status to report
tradingHalted: false.
Public market data
| Route | Notes |
|---|---|
GET /api/v1/public/markets/{id} | Full market item including instrumentConfig and its oracleBinding |
GET /api/v1/public/markets/{id}/orderbook?depth=N&book=SPOT | book is SPOT, YES or NO. Levels are { price_micros, total_qty }; total_qty is a decimal string holding the base-asset quantity in micro units (same scale as trade qty, always a multiple of lotSizeMicro). There is no /book alias (404). |
GET /api/v1/public/markets/{id}/trades?limit=N | items[] with price and quantity in micro units, book and timestamp |
GET /api/v1/public/markets/{id}/ticker | Last price and 24 h statistics |
GET /api/v1/public/markets/{id}/candles?tf=1m&count_back=N | OHLCV; see Charting |
GET /api/v1/public/assets | Registered vault assets (ARB, CKT, FYT, TCO, USDC, USDT, WBTC and ETH, listed as WETH) with token address, decimals and assetId |
Product families
Oracle bindings (readback 2026-09-14): market 1 retains its V1 barrier
binding (instrumentConfig.oracleBinding.kind: price_barrier_v1; median of
Binance, Kraken and Coinbase, minHealthySources: 3, degradedPolicy: resolve_no). Short-dated binaries are bound to Oracle V2
(oracleBinding.kind: canonical_v2 with a policyHash, resolutionPolicy: oracle_v2); market 17 resolved resolved_no through that path on
2026-09-13. Prediction markets carry resolutionPolicy: economic_dispute.
New binary markets require a committed V2 policy before opening. See
Oracle V2 and price resolution.
| Product | Balance model |
|---|---|
| Spot | Buy reserves quote asset; sell reserves the configured base asset |
| Binary option | YES/NO contracts settle to the configured collateral asset |
| Prediction market | Outcome exposure follows its market-specific resolution policy |
Spot and outcome action boundary
Spot clients must use SpotPlaceOrder or SpotQuoteReplace and omit the
YES/NO book field. Binary and prediction markets use OutcomePlaceOrder
(wire alias PlaceOrder) or QuoteReplace with book: YES | NO.
For a spot ask, the engine reserves the configured base asset: market 2 uses
USDC, market 3 WETH, market 4 CKT, market 5 TCO, market 14 WBTC, market 15
ARB and market 21 FYT. An ask on a binary or prediction book reserves YES or NO
shares, which you create from collateral with a Split action first (1 USDC
mints 1 YES + 1 NO). Order qty uses the
exchange-info microsScale; ERC-20 balances, deposits, and withdrawals use the
asset's native token decimals. Convert between those units before a client-side
funding precheck. An InsufficientShares ... book YES response for a spot
market means the client sent an outcome-market envelope; it is not a genuine
spot balance reject.
Prices, quantities and minimum notional
- Prices are integers in
tickSizeMicrosteps;priceDecimalsis the display precision (2 to 6 decimals on the spot markets, 3 decimals on binary and prediction markets, whose prices run from 0.000 to 1.000 USDC per share). - Quantities are integers in
lotSizeMicrosteps of the base asset or of one outcome share. Lot size differs per market: 1 micro on ETH/USDC, 1000 micro on ARB/USDC and on the prediction markets, 1 000 000 micro (one whole token) on FYT/USDC. instrumentConfig.minNotionalMicrois the per-order minimum in quote units: 1 USDC (1000000) on BTC/USDC, ARB/USDC and FYT/USDC; the older spot markets 2–5 carry1. An order below the minimum is rejected (spot_notional_below_minimum). On the BSL compact lane the failing action is dropped at apply (receiptstatus: dropped,applied: false); when it is a leg of aSpotQuoteReplace, the whole replace action, including its other legs, is dropped.
Lifecycle
status on the market item is the only lifecycle field today; there is no
separate "expired" or "resolving" flag. Values observed on production:
status | Behavior |
|---|---|
scheduled | Definition exists but is not yet tradable |
open | Orders may be accepted when the global placement gate is ready and the action ts is before expiryTsMs. status does not change automatically at expiryTsMs: a market can still read open after its expiry while every new order, quote-replace, conditional or algo order is rejected with market N expired for trading at T. Compare expiryTsMs with the current time before quoting. Resting orders are not cancelled at expiry; they stay on the book, cannot trade, and can still be cancelled until the market is closed or resolved. |
halted | New matching is paused. A prediction market shows halted while a resolution case is in its 24 h challenge window (see Resolution); a venue-wide halt is separate and reported as tradingHalted on GET /api/v1/status. |
closed | Not tradable: a binary market before its oracle policy is bound and it is opened, or a market closed by an operator. Closing a market cancels its resting orders and releases their reservations. |
resolved_yes / resolved_no / resolved_invalid | Final result exists; new trading is disabled, all resting orders of the market are cancelled with their reservations released, and settlement pays out per Resolution. resolved_invalid occurs on Oracle V2 binaries only. |
What happens at expiryTsMs
| Market family | At expiryTsMs | Resolution |
|---|---|---|
Oracle V2 binary (resolutionPolicy: oracle_v2) | New orders rejected from ts >= expiryTsMs; status stays open; resting orders stay until resolution | Automatic. The decision is committed only after the policy's recovery deadline (committed per market, between 1 ms and 24 h after the cutoff; the current exchange policies state 5 seconds in rules.rulesText). The market then moves to resolved_*, resting orders are cancelled, and positions are credited by the settlement worker. See Oracle V2. |
Prediction market (economic_dispute) | New orders rejected from ts >= expiryTsMs; status stays open until an operator closes the market or a resolution case is filed | Through the resolution-case process in Resolution; a case in its challenge window shows halted. |
Each market definition supplies its own asset IDs, native decimals, tick and lot sizes, minimum notional, precision, and lifecycle policy. Client examples must derive these values from the market catalog instead of assuming BTC/ETH/SOL launch parameters.