API DOCUMENTATION · v1

Build on the catastrophe-risk market.

The RSKX API is the same surface our trading UI runs on top of. REST for order entry, history, and positions. WebSocket for streaming book and trade data. FIX 4.4 for execution desks who already speak it. All endpoints below are documented pre-launch — production base URL goes live Q3 2026 alongside DCM designation.

Overview

Base URL: https://api.rskx.io/v1 · WebSocket: wss://stream.rskx.io/v1 · FIX: fix.rskx.io:443 (TLS, NY4 cross-connect available)

Contracts are binary event contracts, each keyed to an H3 resolution-9 hex and a defined peril + threshold. Each contract pays $1.00 on a qualifying event, $0.00 otherwise. All amounts are USD, prices are cents (0.00–100.00).

Conventions

  • Request & response bodies: JSON, UTF-8, Content-Type: application/json
  • Timestamps: ISO-8601 UTC, millisecond precision (2026-05-19T14:32:18.412Z)
  • Decimal: strings to preserve precision (e.g. "price": "0.5630")
  • Sequence: monotonic seq per stream channel; resyncs are explicit, never silent
  • Idempotency: Idempotency-Key header on order submit; same key returns same response

Authentication

Every request is authenticated with an API key + HMAC-SHA256 signature over a canonicalized request string. Keys are generated from the Account → API keys page. Treat the secret like a password.

Headers

X-RSKX-Key: rskx_live_8f72c… X-RSKX-Timestamp: 1716123138412 X-RSKX-Signature: hex(HMAC_SHA256(secret, ts + method + path + body))
SECURITY Requests with a timestamp more than 30 seconds out of sync with the server clock are rejected. Withdrawals and orders over $25K notional require a second factor (TOTP) — pass it as X-RSKX-2FA on the request.

Errors & rate limits

HTTP status codes for transport-level failures. Application errors return 4xx/5xx with a structured body.

{ "error": { "code": "INSUFFICIENT_FUNDS", "message": "Buying power $1,200 below required margin $2,100", "request_id": "req_8f72c0a..." } }

Rate limits

  • Public market data: 100 req/sec per IP
  • Authenticated reads: 50 req/sec per key, 600/min
  • Order writes: 25 req/sec per key, burst 100 (then 429)
  • Designated MM keys: 500 req/sec — request via api@rskx.io

Contracts

List active contracts, retrieve a single contract by id, or fetch metadata by (peril, hex).

GET/contracts

List active contracts. Filter by peril, season, or hex prefix.

ParamTypeReqDescription
perilstringnoOne of hurricane, wildfire, flood, earthquake, severe_storm
seasonintnoContract season (e.g. 2026)
hex_prefixstringnoFirst N chars of H3 cell id (filters by region)
limitintnoDefault 100, max 1000
# Example GET /v1/contracts?peril=hurricane&season=2026&limit=3 { "contracts": [ { "id": "HUR-2026-872a10072ffffff", "peril": "hurricane", "hex": "872a10072ffffff", "season": 2026, "threshold": "Category >= 1 landfall", "data_source": "NOAA HURDAT2", "settles_at": "2026-12-31T23:59:59Z", "status": "open", "last": "0.5630", "open_interest": 1420000 }, ... ], "seq": 18472918 }
GET/contracts/:id

Get a single contract by id, including full specification and resolution metadata.

Order book

GET/contracts/:id/book

Top-N snapshot of the lit order book. For streaming L2 use the WebSocket channel.

GET /v1/contracts/HUR-2026-872a10072ffffff/book?depth=10 { "contract_id": "HUR-2026-872a10072ffffff", "bids": [["0.562", 8400], ["0.561", 12000], ...], "asks": [["0.568", 6200], ["0.569", 9100], ...], "seq": 18472918, "ts": "2026-05-19T14:32:18.412Z" }

Orders

Submit, query, and cancel orders. Orders are binary: side is yes or no. Prices are cents (0.0–1.0).

POST/orders

Submit a new order. Use Idempotency-Key header for safe retries.

ParamTypeReqDescription
contractstringyesContract id, e.g. HUR-2026-872a10072ffffff
sideenumyesyes or no
typeenumyesmarket · limit · ioc · fok
qtyintyesContracts. Each contract pays $1.00 on event.
pricedecimalno*0.0–1.0. Required if type=limit. Optional max_price for market orders.
tifenumnoGTC · DAY · IOC
POST /v1/orders Idempotency-Key: desk-8f72c-2026-05-19-0001 { "contract": "HUR-2026-872a10072ffffff", "side": "yes", "type": "limit", "price": "0.563", "qty": 5000, "tif": "GTC" } # Response { "order_id": "ord_8f72c0a...", "status": "open", "filled_qty": 0, "avg_price": null, "created_at": "2026-05-19T14:32:18.412Z" }
GET/orders/:id

Retrieve an order by id. Includes status, filled_qty, avg_price, fills array.

DELETE/orders/:id

Cancel an open order. No-op if already filled/canceled. Returns latest state.

Positions

GET/positions

All open positions grouped by contract. Includes net qty, average entry, unrealized P&L.

Fills

GET/fills

Historical fills, paginated by cursor. Use from/to for time-bounded queries.

RFQ & large blocks

RFQ BEHAVIOR Orders above the visible book route through our RFQ engine. We sweep the lit book first, then ride the back of the resting maker spreads until the order is filled. Same model as Kalshi — no OTC, no dark pool, lit-with-tail.
POST/rfq

Submit a block RFQ. Returns an indicative all-in price; POST /rfq/:id/accept within 30s to execute at indicated levels.

POST /v1/rfq { "contract": "HUR-2026-872a10072ffffff", "side": "yes", "qty": 250000 } # Response { "rfq_id": "rfq_4b81f...", "avg_price": "0.5681", "lit_sweep_qty": 12400, "maker_tail_qty": 237600, "expires_at": "2026-05-19T14:32:48.412Z" }

WebSocket streaming

Subscribe to streaming book updates, trades, and order/position events. Single connection, multiple channel subscriptions, monotonic seq per channel.

// Subscribe to L2 + trades for one contract ws.send({ "type": "subscribe", "channels": ["book.l2", "trades"], "contracts": ["HUR-2026-872a10072ffffff"] }); // Incoming book delta { "channel": "book.l2", "contract": "HUR-2026-872a10072ffffff", "side": "bid", "price": "0.562", "size": 8400, "seq": 18472919 }

FIX 4.4

For execution desks already on FIX. Logon at fix.rskx.io:443, TLS-secured. NY4 cross-connect available — contact fix@rskx.io.

Supported messages

  • D — New Order Single (limit, market, IOC, FOK)
  • F — Order Cancel Request
  • G — Order Cancel/Replace Request
  • 8 — Execution Report (fills, partials, cancels)
  • AB — New Order Multileg (for paired YES/NO basket trades)
# New Order Single — limit buy YES 5000 @ 0.563 8=FIX.4.4|9=148|35=D|49=DESK01|56=RSKX|34=12|52=20260519-14:32:18| 11=ord_8f72c0a|55=HUR-2026-872a10072ffffff|54=1|38=5000|40=2|44=0.563|59=1|10=174

Object reference

Contract

FieldTypeDescription
idstringCanonical id, e.g. HUR-2026-872a10072ffffff
perilenumOne of the 5 perils
hexstringH3 resolution-9 cell id
thresholdstringHuman-readable trigger condition
data_sourcestringAuthoritative public source (NOAA HURDAT2, USGS ShakeMap, etc.)
settles_atdatetimeUTC, end of contract period
statusenumopen · settling · disputed · resolved · paid

Order

FieldTypeDescription
order_idstringServer-assigned id
statusenumopen · partial · filled · canceled · rejected
filled_qtyintCumulative filled contracts
avg_pricedecimalVolume-weighted average fill price

Changelog

  • v1.0 (Q3 2026 target) — Public API GA at DCM designation
  • v0.9-beta — RFQ endpoint, multileg FIX, idempotency keys
  • v0.8-beta — FIX 4.4 support, NY4 cross-connect
  • v0.5-alpha — Private beta REST + WebSocket for design partners
PRE-LAUNCH These docs describe the target API surface. The production endpoint goes live alongside CFTC DCM designation in Q3 2026. Design partners can request sandbox access today at api@rskx.io.