v1.4.0 Last updated: December 2024

XO Markets API Documentation

Welcome to the XO Markets API documentation. Build prediction market trading applications with our comprehensive, institution-grade API.

About XO Markets

XO Markets is the leading prediction market infrastructure provider, offering a robust API that enables developers to embed prediction market trading functionality into their applications.

Key Features

Use Cases

Use Case Description
Trading Apps Build consumer-facing apps that let users trade on world events
Research Platforms Access probability data for forecasting and analysis
Portfolio Management Integrate event risk into investment strategies
Algorithmic Trading Build automated trading strategies on prediction markets

Quick Start

Step 1: Create an Account

Sign up for an XO Markets account at app.xotrade.co. You'll receive API credentials immediately upon registration.

Step 2: Get Your API Keys

After registration, navigate to the API Keys section in your dashboard.

Environment Base URL Purpose
Sandbox https://sandbox.xotrade.co/v1 Testing and development
Production https://api.xotrade.co/v1 Live trading
Important: Never expose your API Secret Key in client-side code or public repositories.

Step 3: Install the SDK

Python
pip install xo-trade
TypeScript / Node.js
npm install @xo-trade/sdk

Step 4: Make Your First Request

Python
from xo_trade import XO

# Initialize client
client = XO.Client(
    api_key='pk_live_your_key',
    api_secret='sk_live_your_secret'
)

# Get account info
account = client.get_account()
print(f"Balance: ${account.balance}")
print(f"Buying Power: ${account.buying_power}")

# List available markets
markets = client.list_markets(status='open', limit=10)
for market in markets:
    print(f"{market.title}: {market.outcomes}")
TypeScript
import { XOClient } from '@xo-trade/sdk';

const client = new XOClient({
  apiKey: 'pk_live_your_key',
  apiSecret: 'sk_live_your_secret'
});

// Get account info
const account = await client.getAccount();
console.log(`Balance: $${account.balance}`);

// List available markets
const markets = await client.listMarkets({ status: 'open', limit: 10 });
markets.forEach(m => console.log(`${m.title}: ${m.outcomes}`));

Authentication

All API requests require authentication via your API credentials. XO Markets uses HMAC-SHA256 signatures for secure request authentication.

Required Headers

Header Description
XO-API-KEY Your API Key ID
XO-TIMESTAMP Current Unix timestamp (seconds)
XO-SIGNATURE HMAC-SHA256 signature

Signature Generation

Python
import hmac
import hashlib
import time

def generate_signature(secret_key, timestamp, method, path, body=''):
    message = f"{timestamp}{method}{path}{body}"
    signature = hmac.new(
        secret_key.encode(),
        message.encode(),
        hashlib.sha256
    ).hexdigest()
    return signature
Tip: The SDKs handle authentication automatically. Manual signature generation is only needed for direct API calls.

Core Concepts

Markets

A market represents a question about a future event. Each market has:

Outcomes

An outcome is a possible result of a market:

Positions

A position represents your holdings in a specific outcome:

Orders

An order is an instruction to buy or sell shares:

Order Type Description
market Execute immediately at best available price
limit Execute at specified price or better
GTC Good-Til-Canceled: remains open until filled or canceled
IOC Immediate-Or-Cancel: fill immediately or cancel
FOK Fill-Or-Kill: fill entirely or cancel

Settlement & Market Resolution

XO Markets uses the UMA Optimistic Oracle for decentralized, manipulation-resistant market resolution. This is the same oracle infrastructure used by Polymarket.

How Settlement Works

  1. Market Close: Trading halts at the scheduled resolution time.
  2. Oracle Request: XO submits a resolution request to the UMA Optimistic Oracle with the market question and resolution criteria.
  3. Assertion Period: A proposer asserts the outcome (e.g., "Yes" or "Candidate A won"). This assertion is bonded with collateral.
  4. Dispute Window: During the liveness period (typically 2-24 hours), anyone can dispute the proposed outcome by posting a counter-bond.
  5. Resolution: If undisputed, the assertion is accepted. If disputed, the claim escalates to UMA's Data Verification Mechanism (DVM) where UMA token holders vote.
  6. Payout: Winning shares pay $1.00; losing shares pay $0.00. Funds are credited to account balances.

Third-Party Validation for High-Value Markets

For markets with total notional exposure exceeding $100 million USD at settlement, XO requires additional independent verification:

Settlement Statuses

Status Description
openMarket is actively trading
closedTrading halted; awaiting resolution
pending_oracleResolution request submitted to UMA
pending_third_partyAwaiting third-party validation (>$100M markets)
disputedOracle outcome under dispute; escalated to DVM
resolvedFinal outcome determined; payouts processed
cancelledMarket voided; positions refunded at cost basis

Dispute Handling

If an oracle outcome is disputed:

  1. The dispute is escalated to UMA's DVM for a token-holder vote.
  2. Voting occurs over 48-96 hours using a commit-reveal scheme.
  3. The majority vote determines the final outcome.
  4. Incorrect proposers/disputers lose their bonds; correct parties are rewarded.

Markets may be cancelled if the resolution criteria become ambiguous or the underlying event is invalidated.

Trading & Settlement Architecture

XO Markets operates a Central Limit Order Book (CLOB) matching engine with on-chain settlement via ERC-1155 conditional token contracts—the same architectural pattern used by Polymarket.

CLOB Matching Engine

ERC-1155 Settlement Layer

Each market outcome is represented as an ERC-1155 token. When you buy "Yes" shares on a market, you receive ERC-1155 tokens representing that position.

Component Description
Conditional TokensYES/NO outcome shares as ERC-1155 tokens
CollateralUSDC locked in the settlement contract
Position TokensRepresent your holdings; redeemable after resolution

End-to-End Trade Lifecycle

  1. Order Submission: Client sends order via REST/WebSocket/FIX.
  2. CLOB Matching: Engine matches against resting orders.
  3. Trade Creation: Matched orders generate trade records.
  4. Ledger Update: Internal balances updated immediately.
  5. On-Chain Settlement: Trades batched and written to ERC-1155 contract.
  6. Market Resolution: UMA oracle (+ third-party for >$100M) determines outcome.
  7. Redemption: Winning tokens redeemed for $1.00 per share.

On-Chain Provenance

XO surfaces on-chain settlement data via API responses. Integrators do not need to interact directly with smart contracts.

Field Description
tx_hashEthereum transaction hash for the settlement
chain_idNetwork identifier (e.g., 137 for Polygon)
contract_addressERC-1155 conditional token contract
token_idUnique identifier for the outcome token
block_numberBlock in which settlement was confirmed
Note: XO manages all contract interactions and gas fees. Institutional integrators consume on-chain metadata via the API for reconciliation and audit purposes.

API Reference

Account

Get Account

Retrieve account information including balance and buying power.

GET /v1/account
Response
{
  "id": "acc_8a9b2c3d",
  "email": "trader@example.com",
  "status": "active",
  "balance": 10000.00,
  "buying_power": 8500.00,
  "pending_orders_value": 1500.00,
  "realized_pnl": 2340.50,
  "unrealized_pnl": -150.00,
  "created_at": "2024-01-15T10:30:00Z"
}

Markets

List Markets

Retrieve available prediction markets.

GET /v1/markets

Query Parameters

Parameter Type Description
status string Filter by status: open, closed, resolved
category string Filter by category: politics, finance, sports, etc.
search string Search by title or description
limit integer Max results (default: 50, max: 500)
Response
{
  "markets": [
    {
      "id": "us-election-2028",
      "title": "Who will win the 2028 US Presidential Election?",
      "category": "politics",
      "status": "open",
      "volume_24h": 1250000.00,
      "total_volume": 45000000.00,
      "outcomes": [
        { "id": "vance", "name": "JD Vance", "price": 0.35 },
        { "id": "newsom", "name": "Gavin Newsom", "price": 0.28 },
        { "id": "other", "name": "Other", "price": 0.37 }
      ]
    }
  ],
  "next_cursor": "eyJpZCI6InVzLWVsZWN0aW9uLTIwMjgifQ=="
}

Get Market

GET /v1/markets/{market_id}

Get Order Book

GET /v1/markets/{market_id}/outcomes/{outcome_id}/orderbook

Orders

Place Order

Submit a new order.

POST /v1/orders
Request Body
{
  "market_id": "us-election-2028",
  "outcome_id": "vance",
  "side": "buy",
  "type": "limit",
  "amount_usd": 5000.00,
  "limit_price": 0.35,
  "time_in_force": "GTC",
  "client_order_id": "my-order-123"
}

Parameters

Parameter Type Required Description
market_id string Yes Market identifier
outcome_id string Yes Outcome identifier
side string Yes buy or sell
type string Yes market or limit
amount_usd number Yes Order size in USD
limit_price number For limit Price between 0.01-0.99

List Orders

GET /v1/orders

Cancel Order

DELETE /v1/orders/{order_id}

Positions

List Positions

GET /v1/positions
Response
{
  "positions": [
    {
      "market_id": "us-election-2028",
      "market_title": "Who will win the 2028 US Presidential Election?",
      "outcome_id": "vance",
      "outcome_name": "JD Vance",
      "side": "long",
      "qty": 14285.71,
      "avg_entry_price": 0.35,
      "current_price": 0.38,
      "market_value": 5428.57,
      "cost_basis": 5000.00,
      "unrealized_pnl": 428.57,
      "unrealized_pnl_percent": 8.57
    }
  ]
}

Close Position

DELETE /v1/positions/{market_id}/{outcome_id}

Settlement

Get Settlement Status

Retrieve the settlement status and oracle metadata for a market.

GET /v1/markets/{market_id}/settlement
Response
{
  "market_id": "us-election-2028",
  "status": "resolved",
  "final_outcome_id": "vance",
  "final_outcome_name": "JD Vance",
  "resolution_timestamp": "2028-11-09T04:30:00Z",
  "oracle": {
    "provider": "uma",
    "request_id": "0x7a8b9c...",
    "assertion_timestamp": "2028-11-09T02:00:00Z",
    "liveness_period_hours": 2,
    "dispute_status": "none",
    "resolved_at": "2028-11-09T04:00:00Z"
  },
  "third_party_validation": {
    "required": true,
    "threshold_usd": 100000000,
    "market_notional_usd": 245000000,
    "provider": "PricewaterhouseCoopers",
    "status": "verified",
    "attestation_url": "https://xotrade.co/attestations/us-election-2028.pdf",
    "verified_at": "2028-11-09T04:30:00Z"
  },
  "on_chain": {
    "chain_id": 137,
    "contract_address": "0x4D97...",
    "resolution_tx_hash": "0xabc123...",
    "block_number": 98765432
  },
  "payout": {
    "winning_payout_per_share": 1.00,
    "losing_payout_per_share": 0.00,
    "total_payout_usd": 122500000
  }
}

Response Fields

Field Type Description
statusstringopen, closed, pending_oracle, pending_third_party, disputed, resolved, cancelled
final_outcome_idstringID of the winning outcome (when resolved)
oracle.providerstringOracle system used (uma)
oracle.request_idstringUMA oracle request identifier
oracle.dispute_statusstringnone, active, resolved
third_party_validation.requiredbooleanWhether third-party validation was required
third_party_validation.providerstringName of the validating firm
third_party_validation.attestation_urlstringLink to published attestation document
on_chain.tx_hashstringSettlement transaction hash
on_chain.contract_addressstringERC-1155 contract address

Get Settlement History

GET /v1/markets/{market_id}/settlement/history

Query Parameters

Parameter Type Description
limitintegerMax results (default: 50)
cursorstringPagination cursor

Trades

Retrieve executed trade data for reconciliation and audit purposes.

List Trades

Retrieve your executed trades.

GET /v1/trades

Query Parameters

Parameter Type Description
market_idstringFilter by market
outcome_idstringFilter by outcome
start_timestringStart timestamp (ISO 8601)
end_timestringEnd timestamp (ISO 8601)
limitintegerMax results (default: 100, max: 1000)
Response
{
  "trades": [
    {
      "trade_id": "trd_8a7b6c5d",
      "order_id": "ord_992837",
      "market_id": "us-election-2028",
      "outcome_id": "vance",
      "side": "buy",
      "price": 0.35,
      "qty": 14285.71,
      "notional_usd": 5000.00,
      "fee_usd": 0.00,
      "maker_taker": "taker",
      "executed_at": "2024-12-01T09:15:00.456Z",
      "on_chain": {
        "tx_hash": "0xdef456...",
        "block_number": 98765400,
        "log_index": 23
      },
      "timestamps": {
        "gateway_received_at": "2024-12-01T09:15:00.012Z",
        "exchange_timestamp": "2024-12-01T09:15:00.015Z",
        "match_timestamp": "2024-12-01T09:15:00.018Z"
      }
    }
  ],
  "next_cursor": "..."
}

Response Fields

Field Type Description
trade_idstringUnique trade identifier
maker_takerstringmaker (added liquidity) or taker (removed liquidity)
on_chain.tx_hashstringSettlement transaction hash
on_chain.log_indexintegerEvent log index within the transaction
timestamps.gateway_received_atstringWhen order was received at gateway
timestamps.exchange_timestampstringExchange processing timestamp
timestamps.match_timestampstringExact time of match execution

Get Market Trades (Public)

GET /v1/markets/{market_id}/trades

Audit Log

Access the institutional-grade audit log for compliance and reconciliation. All orders, trades, transfers, and account events are captured in an append-only, tamper-evident log.

List Audit Events

GET /v1/audit/logs

Query Parameters

Parameter Type Description
event_typestringFilter by type: order_submitted, order_filled, order_cancelled, balance_change, transfer, market_resolved
start_timestringStart timestamp (ISO 8601)
end_timestringEnd timestamp (ISO 8601)
limitintegerMax results (default: 100, max: 1000)
Response
{
  "events": [
    {
      "event_id": "evt_a1b2c3d4",
      "sequence": 9827364,
      "timestamp": "2024-12-01T09:15:00.456Z",
      "account_id": "acc_8a9b2c3d",
      "event_type": "order_filled",
      "entity_type": "order",
      "entity_id": "ord_992837",
      "data": {
        "market_id": "us-election-2028",
        "outcome_id": "vance",
        "side": "buy",
        "fill_price": 0.35,
        "fill_qty": 14285.71,
        "maker_taker": "taker",
        "trade_id": "trd_8a7b6c5d"
      },
      "on_chain": {
        "tx_hash": "0xdef456...",
        "block_number": 98765400
      }
    }
  ],
  "next_cursor": "..."
}

Event Types

Event Type Description
order_submittedOrder received and accepted
order_filledOrder partially or fully filled
order_cancelledOrder cancelled by user or system
balance_changeAccount balance modified (trade, deposit, withdrawal, payout)
transferFunds transferred between accounts
market_resolvedMarket settlement completed
Note: Audit logs are retained for 7 years. For extended retention or custom export formats, contact enterprise@xotrade.co.

Sub-Accounts

Manage sub-accounts under a master/omnibus account. Ideal for retail brokers managing end-user accounts.

Create Sub-Account

POST /v1/accounts/sub-accounts
Request Body
{
  "external_id": "user_12345",
  "label": "John Doe",
  "metadata": {
    "tier": "standard",
    "region": "US"
  }
}
Response
{
  "sub_account_id": "sub_a1b2c3d4",
  "external_id": "user_12345",
  "label": "John Doe",
  "balance": 0.00,
  "buying_power": 0.00,
  "status": "active",
  "created_at": "2024-12-01T10:00:00Z"
}

List Sub-Accounts

GET /v1/accounts/sub-accounts

Get Sub-Account

GET /v1/accounts/sub-accounts/{sub_account_id}

Placing Orders for Sub-Accounts

Include the sub_account_id parameter when placing orders:

Request Body
{
  "market_id": "us-election-2028",
  "outcome_id": "vance",
  "side": "buy",
  "type": "limit",
  "amount_usd": 500.00,
  "limit_price": 0.35,
  "sub_account_id": "sub_a1b2c3d4"
}

Historical Market Data

Access historical price and volume data for charting and analysis.

Get Candlestick Data (OHLCV)

GET /v1/markets/{market_id}/candles

Query Parameters

Parameter Type Description
outcome_idstringRequired. Outcome identifier
intervalstringCandle interval: 1m, 5m, 15m, 1h, 4h, 1d
start_timestringStart timestamp (ISO 8601)
end_timestringEnd timestamp (ISO 8601)
limitintegerMax candles (default: 100, max: 1000)
Response
{
  "market_id": "us-election-2028",
  "outcome_id": "vance",
  "interval": "1h",
  "candles": [
    {
      "timestamp": "2024-12-01T09:00:00Z",
      "open": 0.34,
      "high": 0.36,
      "low": 0.33,
      "close": 0.35,
      "volume": 125000.00,
      "trade_count": 847
    }
  ]
}

Get Historical Prices

GET /v1/markets/{market_id}/history

Idempotency

XO Markets supports idempotent requests to safely retry operations without risk of duplicate execution.

Using Idempotency Keys

Include the Idempotency-Key header on any POST request:

Request Header
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000

Behavior

Scenario Result
First request with keyRequest processed normally; response cached
Duplicate request (same key, same body)Original response returned; no re-execution
Same key, different bodyError: idempotency_key_mismatch
Key not providedRequest processed; no idempotency protection

Best Practices

FIX Protocol

XO Markets supports FIX 4.4 for institutional order entry and market data. FIX is available for Enterprise tier customers.

Connection Details

Environment Host Port
Productionfix.xotrade.co4433 (SSL)
Sandboxfix-sandbox.xotrade.co4433 (SSL)

Session Configuration

Parameter Value
BeginStringFIX.4.4
SenderCompIDYour assigned CompID
TargetCompIDXOTRADE
HeartBtInt30 (seconds)

Supported Message Types

Inbound Messages

MsgType Name Description
DNewOrderSingleSubmit a new order
FOrderCancelRequestCancel an existing order
GOrderCancelReplaceRequestModify an existing order
VMarketDataRequestSubscribe to market data

Outbound Messages

MsgType Name Description
8ExecutionReportOrder status and fill reports
9OrderCancelRejectCancel/modify rejection
WMarketDataSnapshotFullRefreshFull order book snapshot
XMarketDataIncrementalRefreshOrder book updates

Custom Tags

Tag Name Description
20001MarketIDXO market identifier
20002OutcomeIDOutcome identifier
20003SMPGroupSelf-match prevention group
20004SubAccountIDSub-account identifier
Contact: For FIX onboarding and CompID assignment, email fix@xotrade.co.

Market Maker Features

Cancel All / Kill Switch

Rapidly cancel orders or halt trading in emergency situations.

Cancel All Orders

DELETE /v1/orders

Cancel all open orders with optional filters for market_id, side, or outcome_id.

Response
{
  "cancelled_count": 47,
  "cancelled_order_ids": ["ord_001", "ord_002"],
  "cancelled_at": "2024-12-01T09:15:00.123Z"
}

Activate Kill Switch

POST /v1/kill-switch

Immediately cancel all open orders and prevent new order entry until reset.

Reset Kill Switch

DELETE /v1/kill-switch

Self-Match Prevention (SMP)

Prevent your orders from executing against each other to avoid wash trading.

Configuration

Assign an smp_group to orders that should not match against each other:

Request Body
{
  "market_id": "us-election-2028",
  "outcome_id": "vance",
  "side": "buy",
  "type": "limit",
  "amount_usd": 5000.00,
  "limit_price": 0.35,
  "smp_group": "desk_alpha",
  "smp_mode": "cancel_newest"
}

SMP Modes

Mode Behavior
cancel_newestCancel the incoming (aggressing) order
cancel_oldestCancel the resting order
cancel_bothCancel both orders
decrement_and_cancelReduce size of larger order; cancel smaller

Latency & Timestamps

XO provides detailed timestamps for latency analysis and trade reconciliation.

Timestamp Fields

Field Description
gateway_received_atWhen the order was received at the API gateway
exchange_timestampWhen the order entered the matching engine queue
match_timestampExact time of execution/match
gateway_sent_atWhen the response was sent from gateway

Calculating Latency

Metric Calculation
Gateway-to-Exchangeexchange_timestamp - gateway_received_at
Queue Timematch_timestamp - exchange_timestamp
Total Round-Tripgateway_sent_at - gateway_received_at
Co-Location: Enterprise tier customers can deploy in our co-located data centers for sub-millisecond latency. Contact enterprise@xotrade.co for availability.

WebSocket Streaming

XO Markets provides real-time streaming data via WebSocket connections.

Connection

WebSocket URL
wss://stream.xotrade.co/v1

Subscribe to Market Data

Subscribe Message
{
  "action": "subscribe",
  "channel": "market",
  "market_id": "us-election-2028"
}

Settlement Updates

Subscribe to real-time settlement status changes:

Subscribe Message
{
  "action": "subscribe",
  "channel": "settlement",
  "market_id": "us-election-2028"
}
Settlement Update
{
  "type": "settlement",
  "market_id": "us-election-2028",
  "status": "resolved",
  "previous_status": "pending_third_party",
  "final_outcome_id": "vance",
  "final_outcome_name": "JD Vance",
  "oracle": {
    "provider": "uma",
    "request_id": "0x7a8b9c...",
    "resolved_at": "2028-11-09T04:00:00Z"
  },
  "third_party_validation": {
    "provider": "PricewaterhouseCoopers",
    "status": "verified"
  },
  "on_chain": {
    "tx_hash": "0xabc123...",
    "block_number": 98765432
  },
  "timestamp": "2028-11-09T04:30:00.123Z"
}

Python Example

Python
import asyncio
from xo_trade import XO

async def main():
    client = XO.Client('pk_live_your_key', 'sk_live_your_secret')
    
    async def on_price(data):
        print(f"{data['outcome_id']}: {data['price']:.2%}")
    
    # Subscribe to market prices
    await client.stream.subscribe('market', 'us-election-2028', on_price)
    
    # Keep connection alive
    await client.stream.run_forever()

asyncio.run(main())

Sandbox Environment

Use the sandbox environment for development and testing without risking real funds.

Sandbox Features

Environment URL
API https://sandbox.xotrade.co/v1
WebSocket wss://sandbox-stream.xotrade.co/v1

SDKs & Tools

Official SDKs

Language Package Install
Python xo-trade pip install xo-trade
TypeScript @xo-trade/sdk npm install @xo-trade/sdk
C++ xo-trade vcpkg install xo-trade

Community Libraries

Rate Limits

Tier Requests/Minute WebSocket Connections
Free 100 1
Starter 300 3
Pro 1,000 10
Enterprise Unlimited Unlimited

Rate limit headers are included in every response:

Response Headers
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 295
X-RateLimit-Reset: 1699900060

Error Handling

HTTP Status Codes

Code Meaning
200Success
201Created
400Bad Request - Invalid parameters
401Unauthorized - Invalid credentials
403Forbidden - Insufficient permissions
404Not Found - Resource doesn't exist
429Too Many Requests - Rate limited
500Internal Server Error

Error Response Format

JSON
{
  "error": {
    "code": "insufficient_balance",
    "message": "Insufficient buying power for this order",
    "details": {
      "required": 5000.00,
      "available": 2500.00
    }
  },
  "request_id": "req_a1b2c3d4"
}

FAQ

General

What are prediction markets?

Prediction markets are exchange-traded markets where participants buy and sell shares based on the outcome of future events. Share prices reflect the market's collective probability estimate.

How do payouts work?

Each share pays $1 if the outcome occurs, $0 otherwise. If you buy "Yes" shares at $0.35 and the outcome happens, you receive $1 per share (profit of $0.65/share).

Trading

What are the trading hours?

Markets are open 24/7, 365 days a year. Individual markets may close before their resolution date.

What's the minimum order size?

The minimum order is $1.00 USD.

Are there trading fees?

XO Markets charges no commission on trades. There is a small spread built into market prices.

Technical

What's the API latency?

Median order execution latency is under 50ms. WebSocket updates are delivered within 10ms of market changes.

Do you support FIX protocol?

Yes, FIX 4.4 is available for Enterprise tier customers. We support NewOrderSingle (D), OrderCancelRequest (F), OrderCancelReplaceRequest (G), and full market data streaming. See the FIX Protocol section for the complete specification.

Institutional

How are markets settled?

XO uses the UMA Optimistic Oracle for decentralized market resolution. For markets exceeding $100M in total notional at settlement, we additionally require third-party validation from recognized auditors (e.g., PricewaterhouseCoopers). See Settlement & Market Resolution for details.

How do sub-accounts work?

Retail brokers and trading apps can manage end-user accounts via our sub-account API. Create sub-accounts under your master account, then specify sub_account_id on orders to track positions and P&L separately per user. See Sub-Accounts for the full API reference.

How can we access audit logs?

The /v1/audit/logs endpoint provides an append-only, tamper-evident log of all account activity including orders, fills, transfers, and settlements. Logs include on-chain transaction references for reconciliation. Data is retained for 7 years.

Do you support self-match prevention?

Yes. Assign an smp_group to orders that should not execute against each other. Supported modes include cancel_newest, cancel_oldest, cancel_both, and decrement_and_cancel. See Market Maker Features.