Documentation

The venue that publishes how much it trusts its own price

Every exchange shows you a number. Openfield shows you the number and its confidence, then spends that confidence on your leverage, your margin and the order in which a failing book is unwound. This page documents the mechanism, the formulas and the limits, including the parts that are not finished.

live from the engine
Markets—
Price sources polled—
Median oracle confidence—
Engine—

What Openfield is

Openfield is a derivatives venue built around one claim: a price is an estimate, and an estimate without its uncertainty is a liability. The engine aggregates several independent sources per market, measures how far they disagree and how stale they are, and turns that measurement into a number it publishes as price confidence. Confidence then drives the three things that actually decide whether a trader survives a bad hour: how much leverage is available, how much margin a portfolio must post, and how a losing book gets unwound.

The pre-launch runs on real money. Prices, spreads, confidence and the entire margin engine were built and shown first, on paper, for a year; custody came only once the risk core had been proven in the open. Accounts settle in USDC on Solana. A deposit goes to an address that is yours alone and is credited when it is final; withdrawals go to an address you have proved you control, are approved by the operator and signed by the venue's vault; the books are reconciled against the chain every hour and payouts stop the moment they disagree.

Why it exists

Perpetual venues solved distribution and matching, then handed the risk decisions to whoever deploys a market. Listing an illiquid asset with the margin logic of a liquid one is how a contract falls 45% from its opening print in an afternoon. A pricing error on a third-party market leaves a user with nobody to go to. And a continuously quoted contract on a reference market that closes at the weekend is a gap waiting to happen.

The common thread is not bad luck. It is that the risk decision was separated from the party who bears its consequence. Openfield puts market definition, oracle, leverage limits and halting behaviour under one roof, and writes down the escalation order before listing rather than voting on it after an incident.

The falsifiable promise. No Openfield user loses money to an oracle failure or a liquidation cascade the engine could have seen coming. We do not promise you will not lose money on the market moving; that is your job. We promise you will not lose it to our infrastructure being surprised.

Truth layer

Every market carries up to eight independent sources, the majors all eight. On each tick the engine takes a bulk snapshot from every venue, learns each source's structural basis, then computes an estimate and its confidence.

Basis learning

A USDT-quoted venue and a USD-quoted venue do not print the same number, and they never will. Punishing that constant offset would mean permanently distrusting a perfectly healthy market. The engine keeps a slow exponential average of each source's deviation from the median and treats it as that source's basis. Confidence then penalises deviation from the learned basis, not the basis itself.

The quoting floor

Sources cannot agree more tightly than their own quoting granularity. On an asset priced at $0.0000035, one exchange tick is already tens of basis points. The engine subtracts half the prevailing spread before charging any divergence, so a micro-priced market is judged on real disagreement rather than on tick size.

confidence = cdivergence × cfreshness × cdiversity c_divergence = exp( −max(0, worst_deviation_bps − spread_bps/2) / 40 ) c_freshness = exp( −max(0, oldest_quote_age_s − 3) / 6 ) c_diversity = min(1, live_sources / expected_sources)

Source roles

Not every source is a tick source. An official daily FX fixing is an anchor: it belongs in the divergence check but has no business being penalised for age. Sources carry a role, and reference-role sources are exempt from the freshness term. This is stated in the code and in the confidence breakdown the terminal shows on click.

Every crypto market now reads up to eight sources: Binance, OKX, Bybit, KuCoin and Bitget in USDT, Coinbase and Kraken in dollars, and Hyperliquid, a perpetual-futures DEX whose mids arrive in one call and whose basis to spot is learned like any other. A venue that does not list a pair is noticed on the first ticks and excluded from the count rather than carried as a dead source. A source is no sharper than its own spread: a book quoting five times wider than the others does not define the disagreement, though it still counts for freshness and for the number of live sources. And with four or more sharp sources, one venue lagging is not a disagreement: the median has already ignored it, and the divergence is the second-widest deviation. With three sources every one counts, as it always did.

The three constants in the confidence formula are heuristics, and the replay reports how much the regime depends on them: moving the divergence scale a quarter either way changes the regime on about one minute in seven and the ceiling on one in three; the freshness constants cannot be tested on candle data and their sensitivity on the live venue is unmeasured.

Market regimes

Confidence maps onto five named regimes. The point of five rather than two is that the engine never has to choose between "fine" and "halted", and it never takes an arbitrary price from a thin book at the moment the book is thinnest.

FullComplete leverage, normal discounts.
DivergenceOracle surcharge grows, position growth slows.
DegradedOffsets cut, book becomes reduce-only.
UnavailableConservative mark, managed pause.
DisputeReserve raised, dispute window opens.

Full ≥ 97% · Divergence ≥ 90% · Degraded ≥ 75% · below that, Unavailable.

Risk genome

Gold, bitcoin and a memecoin cannot share one margin formula. Each instrument carries a machine-readable profile of its own risk physiology, and the profile is what stops a new listing from inheriting a major's leverage ceiling by accident.

TraitWhat it measuresWhat it drives
VolatilityRealized, exponentially weighted, per regimeBase margin and price corridors
Gap riskJump distribution, default intensityStress add-on and leverage ceiling
LiquidityDepth, spread, impact, recovery timeLiquidation size and position limits
Data qualityFreshness, divergence, source diversityConfidence discount on leverage
ContinuityReference market hours and closuresWeekend surcharge while the hedge sleeps
ConcentrationLargest trader, maker, data sourceNon-linear penalty
Correlation stabilityHow relationships break under stressDiscount on portfolio offsets

Adaptive leverage

Maximum leverage is not a constant in a config file. It is the genome ceiling multiplied by three factors the engine measures continuously, and every deduction is printed rather than implied.

leverage = ceiling × fconfidence × fvolatility × fcontinuity f_confidence = clamp((confidence − 70) / 30, 0.05, 1) f_volatility = min(1, vol_anchor / max(vol_anchor, realized_vol × 40)) f_continuity = 1 while the reference market trades, otherwise the genome's closed multiplier
Worked example. BTC-USD with a ceiling of 20×, confidence at 98.4% and vol at anchor: 20 × 0.947 × 1 × 1 = 18.9, floored to 18×. The terminal states it as "18× · ceiling 20×, −1.1 data", and clicking the value opens the full derivation with each source's deviation in basis points.

The ceiling is for what is already open. New risk enters a step below it. A position may be opened at no more than four fifths of the current ceiling, rounded down, and the trader may choose less; the leverage chosen at entry is a property of the position from then on. A position opened at the ceiling would sit within two percent of maintenance; entering below it widens that band, and the replay measures what it is worth. The terminal shows both numbers: the entry cap and the ceiling.

Maintenance, and why it is capped

Maintenance is the smaller of two numbers: six tenths of the initial requirement, and two per cent of the position. The reserve for closing out sits on top. The cap exists because initial margin rises as the engine cuts the ceiling, so a maintenance band defined only against the requirement grew every time the venue became careful, and a trader at eleven times was closed after a 3.2% move while a fixed twentieth tier survived to 4.5%. That is the opposite of the intent, and the replay shows what it cost in an ordinary fortnight before it was changed.

Inherited leverage, and when it ends

A position is margined at the leverage it was opened under. A later fall in the ceiling governs what may be added and puts the account into reduce-only, and it does not re-margin the book. That rule exists because the first version of the replay did the opposite and liquidated accounts the price had never touched.

The inheritance now has an end, because the other side of that rule is a venue carrying positions at ceilings that no longer exist. While the ceiling sits below the leverage a position was opened at, the position is left alone for six hours. After that its margin is re-computed toward the live ceiling on a twelve hour half-life, so within about a day the book is priced at what the engine currently believes. If the ceiling recovers, the clock resets and the position keeps what it had. The terminal states this on the position itself: the leverage it was opened at, the ceiling now, and the moment re-margining starts.

What this costs the trader is written where it happens: a rising requirement on a position that has not moved. What it protects is the account of everyone else, since inherited leverage that never expires is a claim on the insurance fund that nobody agreed to underwrite.

Portfolio margin

One portfolio view, not one netting pool. Every position on the account is margined together and the buffer is one number, but credit for offsetting risk is given only inside a risk family, and inside crypto only up to a quarter. Gold against bitcoin in one account is two risks that share a balance and nothing else. The number on the landing page that says a hedge is cheaper was measured inside crypto, which is the weakest offset we recognise, and that is the largest saving the engine will ever grant.

Cross-margin buys capital efficiency and sells hidden leverage. The dangerous part is not the netting, it is netting a relationship that only existed in calm markets. Openfield recognises offsets inside a risk class only, and only at a credit that survived observed stress.

IMposition = max( notional / leverage , notional × 0.5% ) credit = Σclass IMclass × hedged_fraction × 25% IM = Σ IMposition − credit MM = 0.6 × IM + close-out reserve (0.4% of gross notional)

The close-out reserve exists so the act of liquidating does not itself consume what is left of the account. That is the line item missing from most of the 2026 cascades.

The offset that disappears. The first serious loss at a venue like this almost never comes from volatility. It comes from a netting credit that rested on historical correlation and evaporated under stress. Between risk classes the credit is zero, permanently. Inside a class it is capped at a quarter and only granted against genuinely opposing exposure.

Why a single leg has no liquidation price

Under portfolio margin, the price at which one position is liquidated depends on the whole book. Publishing a per-leg liquidation price as if it were a fact is a comfortable lie. The terminal therefore leads with the portfolio buffer to maintenance in dollars and in survivable adverse move, and shows each position's contribution to the maintenance requirement. The old per-leg estimate is still there, in a tooltip, labelled as an estimate that assumes everything else stands still.

Liquidation as transfer

Liquidation is a transfer problem, not a sell button. When depth disappears, accelerating market orders into an empty book is what turns one bad account into a systemic event. The engine slows down instead.

1 · Warning
Equity approaches the maintenance requirement. Nothing is forced.
2 · Restriction
Reduce-only. The book may shrink but not grow.
3 · Internal netting
Opposing risks inside the portfolio are closed against each other first.
4 · Auction
Participants bid for the portfolio. Transfer, not a dump.

All four steps are live. In liquidation the engine takes one step every three seconds: inside the risk family with the most margin it reduces opposing positions together, so what reaches the market is net risk; the slice is offered to the book inside a band that starts at the penalty and widens by 25 basis points on every unfilled attempt, up to three percent or the bankruptcy price; if nobody takes it before bankruptcy, the family's fund takes the position at that price and unwinds it itself. Every liquidation fill pays the penalty into the family fund. A cash shortfall after the book is closed is covered by the family fund, then the general reserve, and only then by deleveraging the most profitable accounts on the other side, each of which is told so on the chain. Fund balances and every movement are on the status page.

Loss waterfall

Every loss has an owner assigned before listing, and the order is not renegotiated after the event. A promise that can be rewritten under stress was never a promise.

StepWho paysNote
Account equityThe traderFirst loss, always.
Liquidation penaltyThe liquidated accountCompensates the transfer.
Market fundThat risk familyRing-fenced. Crypto does not pay for a mistake in gold.
General fundShared reserveStrict inclusion conditions.
Position reductionProfitable counterpartiesLast resort, not routine.

Reference markets and continuity

A continuously quoted contract on an instrument whose reference market closes is the cleanest example of gap risk there is. The engine carries real exchange calendars rather than one hard-coded week, and searches forward for the next state change instead of hand-deriving each boundary.

While the reference is shut the hedge is unavailable, so the genome's closed multiplier applies for the whole window: gold and the indices halve, energy takes a deeper cut. The terminal marks the exact boundary on the price axis and counts down to it.

Order book and protocol-side liquidity

Every market has a central limit order book of our own: price-time priority, one queue per side, orders matched between accounts. A venue with an empty book has nothing to fill against and hired makers will not quote an empty venue, so the protocol quotes first. A house account rests eight levels a side around the engine's mid on every market, at a half-spread and a size that follow the same confidence the traders see: wider and thinner as sources disagree or volatility rises, thinner again in Degraded, gone in Unavailable. Its quotes skew to flatten its own inventory. The house is an ordinary account with two exemptions: it is never liquidated and never on the leaderboard. Its equity, inventory and profit and loss are on the status page, and every one of its fills is on the chain like anyone else's.

The terminal shows this book, with the house share of the depth stated, and the tape is our own prints. Self-trade prevention cancels the resting order and lets the taker continue. Post-only orders that would cross are refused rather than converted.

The conflict, and how the house steps back

A venue that quotes its own book is price source, counterparty and liquidator at once. With money on the table that is the first accusation, and a fair one. Four things are in place. The mark that margins and liquidates every account comes from the external sources described above, never from our book, so the house cannot move the price it is judged by. The house trades with its own capital, in its own account, separate from the funds in the loss waterfall, and its profit and loss is published. Its share of every market's depth is printed in the terminal and on the status page. And its size shrinks automatically as other makers rest orders near the mid, down to a floor of fifteen percent of its normal presence, so on the day a maker programme quotes a market the house is mostly gone from it without anyone deciding. What remains to decide is who else quotes, and that is a hiring problem, not an engine one.

Orders and fills

Every order is margin-checked against a simulated post-trade state before acceptance, not after: a market order at the worst price it could fill at inside the band, a limit at its price. Once the account falls below maintenance, resting orders that would add risk are cancelled; reducing ones stay, because they are the way out. Liquidation steps are taken through the book, capped at the penalty price, and only if nobody is inside that band does the venue take the step itself.

Fees and funding

ItemRateNote
Taker fee4.5 bpsMarket orders and triggered stops.
Maker fee1.2 bpsResting limits that fill.
Funding · cryptopremium index + 0.01% / 8hCharged hourly, clamped at ±0.05% per hour. Longs pay, shorts receive; the sum across accounts is zero.
Funding · macropremium index + 0.005% / 8hSame schedule and clamp. The hourly clock and the premium window survive a restart.
Liquidation penalty50 bpsApplied to the staged close price.

Funding is a premium index. Every minute the mid of our own book is compared with the engine's mid; the hourly rate is the hour's average premium plus a small interest term (0.01% per 8h on crypto, 0.005% on macro), clamped at ±0.05% an hour, charged hourly to open positions. Longs pay when the book trades above the engine's price and shorts pay when it trades below, so the rate is the market's own statement about which side is crowded, and it is printed live in the terminal.

Pre-trade preview

Before an order is sent, the engine simulates it against a copy of your book and returns the whole picture: the margin the position would need standing alone, what it actually costs inside your portfolio, what your existing book saves you, and how the trade moves your buffer to maintenance.

A hedge should visibly cost less. Selling 1 BTC against an existing long shows a standalone requirement of several thousand dollars, an actual portfolio cost that is negative, and a verdict of "reduces portfolio risk". Few venues put that number in front of you before you click.

Accounts

Three doors, and the first two ask for nothing about you.

An anonymous browser session starts trading immediately, and whichever door you later walk through claims that session's positions and history.

Before the first order the account accepts the terms and the risk disclosure once; the acceptance is a record on the account's chain and the API answers terms_required until it exists. From the account page you can link an X account (read access only, no token kept), turn on email alerts for thin margin, export everything the chain holds about the account with its hashes, sign out every other device, and close the account, which removes the sign-in identity and wipes the book while the pseudonymous chain records remain.

Points

The table below is read from the engine when this page loads, so it says what the engine actually credits.

Points are a record of participation, computed from the public chain and nothing else. Anyone can recompute a balance from the exported history. They have no monetary value, cannot be transferred, and entitle you to nothing; the rules can change and the changelog says so first.

>
RulePoints
Opened an account50, once
Read and accepted the terms and the risk disclosure50, once
Signed in with a wallet, an account key or a verified email100, once
First fill250, once
Traded volume1 per $5,000 of notional filled, at most 150 a day
Each day with at least one fill50
Two-factor turned on (email accounts)100, once
Linked an X account100, once
Someone you referred traded on three different days100 each, up to five

The weights are deliberate: a single day of trading outweighs any social action, and everything social together is worth less than a week of use. Nothing is deducted for a liquidation, because that is the event the engine exists to study, and a penalty would teach people to hide from it. We do not verify identity, so we cannot enforce one account per person and do not claim to; what we can do is read the journal, where farming is visible, and remove the points it produced. The leaderboard shows an X handle where one is linked and a shortened account id otherwise.

Public API

Read endpoints are open and unauthenticated. Account endpoints take a bearer token of either account_id:token or sess:<session>.

GET/api/v0/markets
Every market with mid, confidence, regime, adaptive leverage, liquidity grade, per-source deviations, the leverage decomposition and the reference-market window.
GET/api/v0/market/:id/candles?tf=1m&n=400&end=
OHLCV for 1m to 1d. The end cursor pages backwards through history.
GET/api/v0/market/:id/confseries?tf=1m
Confidence and minimum leverage bucketed onto the same time grid as the candles, so the two share one axis.
GET/api/v0/market/:id/book · /tape · /stats
Depth, recent prints and 24h statistics. Reference-fed macro instruments answer honestly that they have no book of ours.
GET/api/v0/stream
Server-sent events: market snapshots every few seconds. Open it with ?t= a ticket from POST /api/v0/stream/ticket (authenticated, valid 60 seconds) to also receive account updates and to see your own degradation drill applied to the snapshot.
POST/api/v0/preview
Full pre-trade margin decomposition for a hypothetical order.
POST/api/v0/order
Market, limit or stop, with optional take profit, stop loss and reduce-only.
DELETE/api/v0/order/:id
Cancel a resting order.
GET/api/v0/journal/root · /journal/verify · /journal/rebuild
The chain head and checkpoints; the chain recomputed from genesis; every account rebuilt from the records alone and compared with the live state.
POST/api/v0/anon/nonce · /anon/wallet · /anon/evm · /anon/btc
Sign in with a wallet: a nonce and a message to sign, then the signature. Solana (ed25519), EVM (personal_sign) and Bitcoin (BIP-137 message signatures for legacy, nested and native segwit addresses; taproot is refused) are verified without third-party code. Nothing is broadcast and no funds move.
GET/api/v0/account/wallets · POST/account/wallets/bind · /primary · /unbind
Several wallets on one account, one payout address per chain family (Solana, EVM, Bitcoin). Binding is the same signature as sign-in over a message that names the purpose (purpose: "bind" on the nonce); the first wallet on a chain becomes that chain's payout address, primary moves it, unbind refuses to remove the last way to sign in. Every change is a chain record: wallet_bound, payout_address_set, wallet_unbound.
GET/api/v0/account/deposit-addresses
One custodial deposit address per chain family: Solana (USDC, USDT), one EVM address for Ethereum, Arbitrum and Base (USDC, USDT where listed), Tron (USDT). Made on first request, secret encrypted at rest. A watcher credits the account's real ledger once a transfer is final (Solana finalized commitment, 12 blocks on Ethereum, 40 on the L2s, TronGrid confirmed), each transaction once, as a deposit_onchain record. Shadow period: the real ledger is recorded and shown, not traded.
GET/api/v0/health · /api/v0/metrics
Health carries the sweep age, load, the chain head against the last flushed sequence and the last boot recovery. Metrics is the same in Prometheus text: engine, feeds per source, regimes, funding rates, invariants, funds, accounts, chain.
POST/api/v0/account/accept
Accept the current terms version for this account; written to the chain. Orders answer terms_required until this exists.
GET/api/v0/account/export
Everything the chain holds about the account, with every record's hash and the current chain head, as a downloadable file.
POST/api/v0/account/notify · /account/close
Email risk alerts on or off (email accounts only); close the account for good, confirmed with its own id.
GET/api/v0/points · /points/board
Your points with the breakdown by rule and your rank; the public leaderboard with the rules as currently applied.
POST/api/v0/x/start · /x/unlink
Begin the X link (returns the authorisation URL) or remove it.
POST/api/v0/sim/degrade
The degradation drill: inject an oracle failure on a market and watch confidence fall, leverage compress and the regime step down in real time.

Pre-launch: accounts, deposits, withdrawals

An anonymous account can be opened from the terminal (with an invite code while the venue requires one, see the pre-launch page) and can watch the engine, read every page and preview orders. The account opens in USDC on Solana the moment it links an identity: a passkey, an e-mail, a wallet or an account key. A deposit address is issued per account; USDC and USDT on Solana are credited when finalized, and the balance appears in the terminal and on the ledger at the same time. Withdrawals are requested from the account page to an address the account has bound and proved, or confirmed by e-mail; each one is held out of collateral the moment it is asked for, approved by the operator, signed by the vault and paid on chain. The terms carry a pre-launch section (version 2026-09-02) and the terminal asks for acceptance before the first order.

Passkeys. The terminal signs in with a passkey: Face ID, Touch ID or a security key, whatever the device offers. The credential is created in the device's secure element and never leaves it; the venue stores the public key and verifies each sign-in's signature over the authenticator data and the request challenge, on the standard library. Creating a passkey binds the browser's anonymous account to it and opens the account, like any other identity. A wallet signature, an account key and e-mail with a code remain available. On a phone installed to the home screen the passkey is the sign-in that fits.

Where the prices come from, and how fast

Since 2 September the crypto venues stream: Binance, OKX, Bybit, Coinbase, Bitget, Kraken and Hyperliquid each hold one WebSocket to the engine, written on the standard library like the rest of it, and the assessment runs every 1.5 seconds on quotes that are typically a few hundred milliseconds old. A socket that goes quiet for five seconds is replaced by the REST poll for that venue until it speaks again, so a dead feed costs latency, never a missing source. KuCoin, the macro reference feeds and the FX fixings stay on REST. The state of every feed, live or not, symbols, messages, reconnects, is on /api/v0/status under feeds and on the status page.

Why the regime does not flicker

The assessment runs every tick and a market's confidence hovers around a cut for hours at a time, so a naive mapping flips the regime on noise: on 2 September BTC went Full → Divergence → Full inside four seconds on 1.3 basis points of disagreement, and the leverage ceiling with it. Three rules now sit between the assessment and the regime. The effective confidence falls at once but recovers on a 45-second time constant, so a dip is honoured immediately and a recovery has to persist. A regime is left upward only when the effective confidence clears the cut by a full point: Divergence starts below 97, Full resumes only above 98; Degraded starts below 90, Divergence resumes above 91. And no regime is left upward inside 30 seconds of entering it. Leverage is derived from the effective confidence, so it comes down as fast as ever and goes back up carefully, which is the right asymmetry for a limit on risk. The raw confidence is still what the terminal shows and what the history records; conf_eff is in the snapshot for anyone who wants to check the arithmetic. Replay runs the raw assessment without these rules, on purpose: it measures the estimator, not the damping.

Calibration, 2 September

Hysteresis stopped the four-second flicker and then showed the real problem: over twenty hours BTC, the most liquid instrument there is, spent 43% of its minutes below the Full line, in episodes of seven to eleven minutes, on two to four basis points of disagreement between eight venues. A regime that fires on the ordinary life of the market has no information in it. The cause was the price of a basis point: divergence was charged at exp(−bps / 40), so one basis point cost 2.5 points of confidence and ten basis points between two venues already read as Degraded. The scale is now 120: one basis point costs 0.8 points, Divergence begins around 4 bps of disagreement on the judged sources, Degraded around 13, Unavailable around 35. On the same twenty hours that puts BTC in Full about 95% of the time, ETH and SOL about 90%, and leaves the eighteen-percent gap of 10 October 2025 exactly where it was. The regime lines themselves, 97 / 90 / 75, did not move: they are the product's vocabulary. The replay was recomputed with the new scale and its page carries the new numbers; the honest cost is visible there: a less nervous confidence hands out a little more leverage during an event, so the venue's own liquidation share in the replay rises from 41.7% to 46.1% against the conventional venue's 61.7%, with mean entry leverage 7.8× instead of 6.9×. When a market is below Full, the terminal now names the source pulling hardest from the mid next to the regime.

The forward look

Every venue shows the state of your margin now. Openfield can show what happens to it when the data gets worse, because here margin depends on the quality of the price. From 2 September the regime of a market does two things to a position already on the book, both fixed in configuration and both shown before you trade. Positions keep the leverage they were opened under; the regime never re-margins the initial requirement.

regime of the marketmaintenance on that legclass offset creditnew risk
Full×1.00100%at the entry cap
Divergence×1.05100%entry cap falls with confidence
Degraded×1.1550%reduce-only
Unavailable×1.250%reduce-only, no fills at mid

The forward look runs the same arithmetic with every market you hold placed at a representative confidence for the regime (98.5, 93 and 82 for Full, Divergence and Degraded; a scenario never improves on the live state) and reports the entry cap for new risk, the added maintenance, the buffer and the margin usage. It appears in three places: as a column on every open position, as a footer under the position table, and as three columns in the pre-trade preview. The numbers are honest about their own smallness: a hedged book in Divergence usually moves by a few hundred dollars, and that is the point.

GET/api/v0/market/:id/regimes
Regime history of one market over the retained window: minutes in each state, every stretch outside Full as an incident with its lowest confidence and widest divergence, and the engine's own account of the last thirty regime moves. The terminal's Instrument page reads it.
POST/api/v0/whatif
Body {cash, positions:[{market, qty (signed), lev, avg?}]}. A hypothetical book margined by the same arithmetic as a real one: requirement with the offset decomposition, maintenance, buffer, the forward look under Divergence and Degraded, a first-order stress. Public, nothing written, up to 24 legs. The terminal's What-if dialog is a front for it.
GET/api/v0/account/scenarios
The account's margin report under Full, Divergence and Degraded next to now, with per-position entry caps, reduce-only flags and maintenance shares; rules carries the multipliers in force. Also a WebSocket op, scenarios.

The house maker has its own page: share of depth on every market, its presence multiplier and how it steps back when external orders arrive, its inventory and P&L. Keyboard on the desktop terminal: / search, b s side, m l t order type, q size, p i o g tabs, w what-if, Esc close, ? the list.

Three things in the terminal now have addresses. app.openfield.markets/#m=BTC-USD&tab=instrument opens the instrument page for a market (genome, calendar, sources, fees, limits, regime history); #m=BTC-USD&tab=portfolio opens the portfolio page (exposure by class, where the requirement comes from, what closing any leg does, the forward look); #m=BTC-USD&tab=log&seq=123 lands on one journal record. Every market-scoped journal record also carries the venue's view of that market at the moment it was written: mark, confidence, regime and leverage ceiling, so a fill can be read against the state it happened in.

On a phone the terminal is a different product: monitoring first, trading second. The first screen is the portfolio: the buffer to maintenance, margin used, equity, the worst regime among held markets, what changed since the last visit (buffer, regime moves, positions opened or closed, events), and one card per position with its forward look. The market screen keeps the mark, the regime line and the leverage; the chart defaults to a price line with the doubt band and a taller confidence pane, because candles do not read at five centimetres. The ticket opens as a sheet from the bottom with leverage presets, the pre-trade preview directly above the button and a second tap to confirm. When the stream stops for more than nine seconds the numbers are marked stale and the ticket refuses to send until it is back.

Push alerts. Leverage here changes on its own while you are not looking, so the venue tells you. From the Account page (or the Portfolio screen on a phone) a device can subscribe to push notifications; every kind of sign-in works, because the subscription belongs to the account, not to an e-mail. What is sent: a regime change on a market you hold, phrased as what it did to you ("BTC → Divergence. Leverage 19× → 11×. Your buffer $210,000 → $140,000."); your account entering warning, reduce-only or liquidation; a liquidation step; a take-profit or stop-loss filling; a price source dropping on a held market. Nothing else. Each kind repeats at most once in ten minutes per account. Delivery uses standard Web Push (VAPID, aes128gcm), implemented on the standard library like the rest of the venue; the payload is encrypted to the device's key and the push service cannot read it.

GET/api/v0/push/vapid
Whether push is configured and the venue's VAPID public key.
POST/api/v0/push/subscribe
Body: the browser's PushSubscription JSON. Account token or session, never a key. Up to eight devices per account. DELETE with {endpoint} removes one; GET /api/v0/push/status lists them; POST /api/v0/push/test sends a sample.

The band of doubt on the chart is drawn in the same honest scale from the same day: its half-width is the widest source disagreement the engine saw in that bucket, in basis points. At 0.4 bps it is a hairline you may not notice; on a day when venues sit 18% apart it covers the screen. It used to be stretched for visibility, which said the opposite of what the number said. It also sits under the candles now, not over them.

Maker API

The maker API is the venue's answer to its own conflict of interest. The house quotes because somebody has to on day one; every order an external program rests inside 25 basis points of mid shrinks the house's size on that market, down to a 15% floor, and the current share is published per market as house_presence. Nothing about the matching changes for a program: the same price-time book, the same self-trade prevention, the same margin check per order, the same fees (1.2 bps maker, 4.5 bps taker), the same journal.

Keys

A key belongs to one account, carries explicit scopes (read, trade, cancel) and its own limits (orders per minute, open orders), and is shown once. At rest the venue keeps a hash. A key can read the account, preview, place and cancel; it cannot create keys, move deposits, accept terms or close the account. Those stay with the account token or a session. Ten keys per account, and revoking a key closes every socket that used it.

POST/api/v0/keys
Body {label, scopes:[...], limits:{orders_per_min, max_open}, ttl_days}. Returns the key and, once, its secret. Authenticate with the account token or a session, not with a key. Journaled as api_key_created.
GET/api/v0/keys
The account's keys without secrets.
DELETE/api/v0/keys/:id
Revoke. Sockets authenticated with that key are closed with code 4001.

Send a key as Authorization: Bearer ak_xxxxxxxx:<secret> on any account endpoint listed above, on the order endpoints, and on the WebSocket handshake. A key on any other route is refused.

Orders

GET/api/v0/orders?market=
Open orders and the ceiling that applies to this caller. The venue holds at most 200 resting orders per account; a key can set a lower number for itself.
POST/api/v0/orders/batch
Body {orders:[{market, side, qty, type, price, post_only, ioc, reduce_only, lev, client_id}, ...]}, up to 20. Each entry is placed in order and answered on its own: a ladder is a loop, not a transaction, and the venue does not pretend otherwise. The reply carries one margin report for the account after the whole batch.
DELETE/api/v0/orders?market=&side=
Cancel every resting order, or every one on a market or a side. Each cancel is its own journal record with reason: "request".

client_id (up to 36 characters of letters, digits, _ . : -) travels with the order into order_placed, fills and cancels, and DELETE /api/v0/order/:id accepts it in place of the venue id. Order budgets are per key (default 600 per minute, batch entries count individually); a refused order answers 429 rate_limited, a scope miss 403 scope.

WebSocket

WS/api/v0/ws
One socket per program. Authenticate on the handshake with the same Authorization header, with ?t= and a stream ticket from a browser, or with a first message {op:"auth", token:"ak_...:secret"} within ten seconds. The server pings every 15 seconds and closes a socket that has not answered for 45.
opfieldsanswer
placethe order fields above{ok, order_id, client_id, resting, filled, fill_px}
batchorders:[...] up to 20{ok, accepted, results:[...]}
cancelorder_id or client_id{ok, order_id}
cancel_allmarket, side optional{ok, cancelled:[ids]}
ordersmarket optionalopen orders
accountthe margin report
subscribe / unsubscribemarkets:[...]a ticker frame per truth tick with mid, confidence, leverage, regime and funding for those markets
codms 100 to 60000, or 0 to disarmcancel-on-disconnect, see below
pingpong

Every request may carry an id, echoed on its answer. Answers to order operations do not include the margin report; instead the socket receives every account-scoped journal record as it is written ({op:"event", type, seq, t, ...}: order_placed, fill, order_cancelled, mode, tp_hit, sl_hit, liquidation and the rest) and, at most twice a second after any of them, a fresh {op:"account", report}. What the socket sees is what the chain holds; there is no second stream to reconcile against.

Cancel-on-disconnect. A maker that quotes many levels should not leave them standing when its process dies. {op:"cod", ms:700} arms it: when the socket closes for any reason, including a missed heartbeat or a venue restart, and no other socket for the same account has it armed within that window, every resting order is cancelled with reason: "disconnect" (or "shutdown") and the account gets a cod_triggered record. Reconnecting inside the window keeps the ladder.

Rate limits and load shedding

One program should not be able to make the venue worse for everybody else. The limits below are the whole policy. They live in one file, api/limits.mjs, with the reasoning for each number written next to it, so there is one place to read them and one place to argue with them.

Budgets are token buckets rather than counters in a fixed window. A bucket starts full, refills at a steady rate and holds at most its burst, which means a key can open with a full ladder and then settle into a sustained rate, and it also means a key cannot save up a minute of allowance and spend it in one millisecond.

Every budget is charged twice: once to the key that made the request, once to the account behind it. Ten keys on one account share the account's allowance, so minting keys buys nothing.

What a program gets

LimitValueWhy
Read requests20/s, burst 40Account, open orders, preview and scenarios. A four-endpoint poll every 250 ms needs 16 a second.
Order requests10/s, burst 60600 a minute sustained, the same ceiling the key record already carried. The burst is three full batches at once.
Cancel requests20/s, burst 120Twice the order budget. Taking risk off is the last thing a venue should make hard.
Batch entries20 per callEach entry costs one order token. A batch of 20 spends 20.
Batch body16 KBTwenty orders come to about 3 KB. A larger body is refused before it is parsed.
Any other body64 KBNothing this API accepts is large.
Open orders200 per accountA key may set itself a lower ceiling and read it back on GET /api/v0/orders.
Open orders on one market50Without it a single account could rest 16,200 orders across the catalogue and own the shape of any one book.
Cancel-replace churn60/min, burst 30Counted only for a cancel of an order that rested under 250 ms. The truth tick is 1.5 s, so nothing the venue knows can have changed in that window, and a cancel that fast is a flicker rather than a re-price. Cancels of orders that actually rested are free.
Market data, per address20/s, burst 60Applies to the unauthenticated read endpoints. Far above what a page needs, far below the rate at which the venue becomes somebody else's price CDN.
New accounts, per address8 an hourEvery account writes to the chain and to disk.

On the socket

LimitValueWhy
Messages25/s, burst 100Above the combined order and cancel budgets, so a real maker meets the operation budget first. This one catches a client sending frames faster than the server can parse them.
Messages over budget in a row20One frame over the line gets an error frame back. Twenty in a row is a loop, and the socket is closed with code 4029.
Subscriptions40 marketsEvery subscribed market is serialized into every ticker frame. Forty is about 27 market updates a second on one socket.
Frame size16 KBThe largest legal message is a 20-order batch.
Sockets per account8One for the program, one for a failover, and room for a reconnect that has not been reaped yet.
Sockets on the venue512Admission control. Past this the per-tick fan-out is what makes the venue late.

Order and cancel operations sent over the socket are charged to the same buckets as the REST calls, so opening a WebSocket does not double a maker's allowance.

What a refusal looks like

A refused request answers 429 with a Retry-After header in whole seconds and a body that names the limit, so a client can back off by reading rather than by guessing.

429Too Many Requests
{"error":"rate_limited","limit":"scope_budget","scope":"trade","retry_after_s":1,"limit_per_s":10,"burst":60,"docs":"https://openfield.markets/docs/#limits"}
The limit field is one of scope_budget, orders_per_min, cancel_replace_churn, public_read or ws_messages. A payload over its cap answers 413 with payload_too_large and the byte ceiling. A scope a key does not hold answers 403 with scope.

Load shedding

Budgets bound one caller. A circuit breaker bounds everyone at once. It opens on any of three signals: the event loop running more than 750 ms behind, the truth tick arriving a whole tick late, or more than 96 requests being served at the same instant. The third is the one that moves under a real flood, where the loop keeps spinning happily while requests queue behind each other.

While it is open the venue refuses new risk with 503 and {"error":"venue_busy","why":"inflight","retry_after_s":2}, again with a Retry-After header. Order entry and batches are shed. Cancels, reads and market data are served throughout, because a venue that stops you from getting out while it is busy has the priority backwards. The breaker stays open for at least two seconds and closes on hysteresis rather than on the first quiet sample, so it does not flap.

GET /api/v0/health publishes what the breaker sees: event loop delay, truth tick lag, requests in flight, whether it is currently shedding, how many times it has tripped and how many requests it has refused.

Market catalogue

Loading the live catalogue…

SectorMarketsSources

Roadmap and gates

Each phase has a proof it must produce and a signal that would mean stopping. The gates are written down so they cannot be quietly moved.

PhaseProof requiredFailure signal
Risk coreScenario margin beats isolated margin on a historical replayOffsets amplify the tail loss
Truth layerCorrect behaviour on stale and diverging dataArbitrary or late transition into degradation
Exchange alphaDeterministic matching and full state recoveryUnexplained state divergence
First macro instrumentStable mark, funding and closing behaviourWeekend gap loss exceeds the reserve
Portfolio liquidationAuction transfers a complex book within the reserveMarket sells create a cascade

Gate status, 1 September 2026. Risk core: the replay shows scenario margin beating a fixed tier on every disagreeing day and says what the maintenance rule costs. Truth layer: stale and diverging data step the regime down on the live venue and in the replay, and the drill demonstrates it per account. Exchange alpha: matching is our own book with price-time priority, and every account is rebuilt from the chain and compared with the live state on the status page. First macro instrument: eleven have run since v0.9 with real calendars; the weekend gap versus the reserve is measured but not yet exercised by a loss. Portfolio liquidation: all four steps are live and the funds are ring-fenced; the auction is bid into by the house and by whoever is in the book, not yet by a maker programme.

What can kill us

The offset that vanishes
A netting credit that held historically and disappears in stress. Mitigated by zero cross-class credit and a capped, stress-tested intra-class credit.
A year of silence
Building the hard part first can produce a product nobody feels. Mitigated by shipping the risk layer as visible product surface from day one.
The incumbent closes the gap
Nothing stops a large venue from taking risk back in-house. Then the advantage is execution quality alone.
Cold-start liquidity
Professional makers will not quote an empty venue. The answer is protocol-side liquidity before hired liquidity, not a rebate curve.

Where things stand

One matrix, kept current with each release, so that the docs, the terminal and the site say the same thing about the same feature.

PieceAvailable nowDemonstrationNext
Matching and bookPrice-time book on every market, house maker, maker API, WebSocket orders, batch, cancel-on-disconnectGuest book in the demoExternal maker programme
Risk coreScenario margin, leverage from confidence, regimes, staged liquidation with penalty, ring-fenced funds, deleveragingCascade and States pages, what-ifLiquidation-maker programme
OrdersMarket, limit, stop, trailing, TWAP, scaled, OCO, bracketsAll in the demo ticketIceberg, post-only TWAP
FundingPremium index, hourly, zero-sum, clock and window persistedPer-market interest terms
RecordHash-chained journal, checkpoints, rebuild, invariants, crash recovery from the chainStatus and trust pagesExternal anchoring of the head
MoneyDeposits and withdrawals in USDC on Solana; per-account addresses, vault-signed payouts, hourly reconcile against the chainInternal real-money phase on the operator's own capital; nothing public until a jurisdiction is chosen
AlertsPush on regime, leverage and buffer changes for held markets; e-mail risk alertsAction Center in the demoCustom thresholds
Macro instrumentsListed with their calendars; single-source books are price-onlySecond source for each macro book

Known limitations

Stated plainly, because a venue whose pitch is honesty about uncertainty cannot be coy about its own.

Reproducibility. Every margin and liquidation decision is recoverable from the event log: which price, which confidence, which genome, which scenario, and why the leverage was what it was. If a decision cannot be replayed, it is a bug, not a feature.