> For the complete documentation index, see [llms.txt](https://docs.strikelabs.app/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.strikelabs.app/protocol/market-structure.md).

# Market structure

What you are trading, when it expires, how it settles, and what it costs to hold. The margin section gives you the actual formulas — you cannot size a position against a description.

## The contract

|                |                                                                                                                                     |
| -------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| **STYLE**      | European. No early exercise.                                                                                                        |
| **SETTLEMENT** | Cash, in USD. Nothing is ever delivered.                                                                                            |
| **MULTIPLIER** | **1.0** — one contract is one underlying unit (one share for equities). Imported provider multipliers never enter venue accounting. |
| **TAKER FEE**  | **50 bps** (`0.005`) of notional, on fills only. Never charged on settlement.                                                       |
| **PRIORITY**   | Price-time. Integer micros end to end; no floating point where money moves.                                                         |
| **HOURS**      | **24/7.** No opening auction, no halt, no weekend, no holiday calendar. The only temporal gate is a series' own expiry.             |

## Series IDs

```
{SYMBOL}-{EXPIRY_TS}-{RIGHT}-{STRIKE}

BTC-1786492800-C-95000
│   │          │ └── strike, no trailing zeros: 95000, or 222.5 for a half strike
│   │          └──── right: C call, P put
│   └─────────────── expiry, unix SECONDS
└─────────────────── underlying
```

`seriesId` is canonical and stable for the contract's life — persist it. The `sid` beside it is a process-local integer alias for the maker's binary wire and **a restart may renumber it**; never persist a `sid`.

## Expiries

**Every expiry is 20:00 America/New\_York**, DST-aware. Do not derive it by slicing a UTC string — the offset changes twice a year and the venue enforces the exact cutoff, silently dropping any series that does not sit on it.

What is listed at any time:

* **7 dailies** — the next 7 consecutive calendar days. **This includes Saturday and Sunday.**
* **8 weeklies** — the next 8 Fridays.
* **Monthlies** — every third Friday, out to a 3-month horizon.

There is **no holiday calendar**. A Friday that is a market holiday is still listed and still expires, including January 1st. If your strategy assumes an exchange holiday, encode that yourself.

Strike ladders are listed around spot — 20 strikes each side by default, both a call and a put at each — with spacing that widens with the underlying's price ($0.50 under $25, $1 under $100, $2.50 under $250, $5 under $1,000, and upward from there). A symbol with no live spot price gets no listings: there is nothing to centre a ladder on.

Trading in a series stops **exactly** at its cutoff, with `series expired`. Settlement itself is not instantaneous — it runs on a maintenance tick, so expect it within about 30 seconds of the cutoff.

## Settlement

Payout is exact intrinsic value against the settlement price. No time value, no model:

```
call: max(settlePrice − strike, 0)
put:  max(strike − settlePrice, 0)
```

Longs are credited, shorts are debited, and the two sides sum to exactly zero — the venue mints nothing. Resting orders in the series are cancelled first. Positions close at the settlement print rather than vanishing, so an expiry shows up as a real closed row in your fills and realized P\&L.

### How the settlement price is determined

Two stages, in this order:

1. A **30-minute TWAP per source**, over the window ending at the expiry cutoff. It is a step function — each sample holds until the next — and the first in-window sample is extended back to the window start.
2. The **median across sources**. With an even number of sources it is the mean of the middle pair.

{% hint style="warning" %}
**What "multiple sources" currently means**

The median exists so no single feed can move the print. Be aware that in the current deployment the sources are correlated: they are distinct price channels drawn from the **same upstream venue**. A single upstream outage can therefore take all of them down together, and the quorum provides less independence than the median implies. Replacing them with a licensed multi-venue spot index is known, planned work, and is not done. We would rather you price that risk than assume it away.
{% endhint %}

### When the oracle refuses

Settlement fails **closed**. The venue refuses to invent a price when:

| CONDITION             | DEFAULT          | MEANING                                                                                                       |
| --------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------- |
| Too few fresh sources | **2** minimum    | A source with no recent sample is dropped and does not count toward quorum.                                   |
| Staleness             | **60 s**         | A source whose last print is older than this at expiry is not fresh.                                          |
| Dispersion            | **100 bps** (1%) | `(max − min) / median` across source TWAPs. Wider than this and the sources do not agree enough to settle on. |

A refused series enters **pending review**. Concretely, and this is what you will observe:

* Its name appears in `pendingReview` on `GET /v1/meta`. That field is public — you do not have to ask anyone.
* It disappears from `GET /v1/series`, which lists live series only.
* **Every resting order in it is cancelled**, whoever owns it.
* **Open positions are kept and no cash moves.** No price is invented.
* It cannot be traded — its expiry has passed, so any order is refused.
* It marks at **intrinsic against current spot** rather than at the now-empty book. So a short in a pending-review series **keeps consuming maintenance margin** and its P\&L keeps moving with spot. This is deliberate: marking it at zero would make every short's liability vanish from margin.

**The oracle does not retry.** A refused series stays pending until an operator resolves it by hand; sources recovering does not release it on its own.

### The hand-settle path, disclosed

An operator can settle a refused series by naming the underlying's settlement price, and the venue then pays intrinsic against it through the identical code path as the oracle. You should know the constraints on that, because it is a human deciding what your contract paid:

* **Only a series the oracle already refused** can be hand-settled. There is no path to override a successful settlement.
* **Two distinct operator secrets** are required. The maker's credential cannot do it, and a venue holding real money refuses to start if those secrets are missing or shared.
* **The price is bounded** — by default within 100 bps of the last oracle print at the expiry moment, anchored on a median so one wild feed cannot move the bound. A configuration ceiling caps this at 1,000 bps (10%) and cannot be raised past it at runtime.
* **No print, no hand settle.** If there was no oracle print at all, the path is closed.
* **Every attempt is audit-logged** — accepted or refused, including unauthenticated ones — with the price, the anchor, the deviation, the bound in force, and each authorisation gate's individual outcome.
* A series settles exactly once.

## Margin

Margin is enforced off-chain by the venue. The four numbers on `GET /v1/me`:

| FIELD               | DEFINITION                                                                                                              |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `equity`            | `cash + Σ (qty × mark)`. `qty` is signed, so shorts subtract.                                                           |
| `buyingPower`       | `cash − locked`. **Position value is not collateral** — longs are paid for, not lent against. Also the withdrawal gate. |
| `maintenanceMargin` | Summed over **short positions only**. Longs contribute exactly zero.                                                    |
| `marginCall`        | `equity < maintenanceMargin`. While true you are reduce-only.                                                           |

`locked` is short-position margin plus resting-order reserves: a resting buy reserves its full cost, and resting sells are aggregated per series and netted against any long before being charged. The aggregation matters — charged one at a time, two resting sells against a single long would each reserve nothing while together they open a short.

### What a short costs

Scenario-based, per contract, and the same shape at entry and maintenance:

```
unit = mark + max( shock × spot − OTM , floor × strike )

OTM  = max(strike − spot, 0) for a call
       max(spot − strike, 0) for a put

entry:        shock = 20%,  floor = 10% of strike
maintenance:  shock = 12%,  floor =  6% of strike
```

In words: the current premium, plus the loss under an adverse move in spot, credited for how far out of the money the strike sits, floored at a fraction of strike so a deep out-of-the-money contract never margins to nothing. At- and in-the-money shorts pay the shock undiminished.

{% hint style="info" %}
**The floor is a fraction of strike, not a number of cents**

`10%` of a $600 strike is $60, not $0.10. If you have seen the floors quoted as dollar amounts somewhere, that description is wrong by three orders of magnitude — the formula above is what the engine computes.
{% endhint %}

The gate charges **incrementally**: only the quantity that actually opens or extends a short is margined, tested against `buyingPower`, which already nets out what resting orders reserve. Nothing is charged twice.

### Cash accounts and margin accounts

Accounts are **cash by default**: `marginEnabled: false`. Flipping it gates exactly one thing — **opening or extending a short**.

Selling is not blocked on a cash account; selling into an uncommitted long is fine. "Uncommitted" is the operative word: a long already promised to a resting sell cannot back a second one. Turning margin *off* is refused while any short exposure exists, resting short-opening sells included, because a flag disagreeing with the book would make the risk gate lie.

### Margin call, and liquidation

While `equity < maintenanceMargin` you are **reduce-only**, narrowly defined: a buy that reduces an existing short, for no more than the short quantity. Buying more than the short, or selling anything, is refused. A qualifying reduce skips the buying-power test and is checked only against cash actually covering it, fee included — meeting your own margin call must not be blocked by a gate you have already failed.

If you stay in margin call, the venue liquidates on a maintenance tick:

* All your resting orders are cancelled first.
* Each short is bought back at market.
* Whatever the book cannot absorb is assigned to the house, priced at the greater of the mark, the current intrinsic, and one cent — so an empty book cannot hand a deep in-the-money short back for nothing.
* Your cash can go negative. The residual is the house's loss, published as `uncollectibleUsd` on [/v1/reserves](/protocol/custody.md).

There is **no liquidation notification** in the API. You observe it as vanished orders, bought-back shorts, and fills you did not place. Watch `marginCall` and act on it yourself.

{% hint style="danger" %}
**Expiry is not liquidation, and this gap is real**

A short that settles in the money beyond its margin is **not caught by liquidation**. Settlement runs before the liquidation sweep on the same tick, and no order — not even a forced one — can trade an expired series. So a gap through the cutoff bypasses liquidation entirely and lands directly on the ledger as negative cash.

Maintenance margin covers roughly a 12% adverse move, and the sweep runs on a timer. An overnight or weekend move larger than that into a 20:00 ET cutoff — and weekend expiries are listed — can leave a short underwater with no intervening sweep. The house absorbs it, and it shows up in `uncollectibleUsd`. If you are short into an expiry, do not rely on being liquidated out of it.
{% endhint %}

## Marks

A series' mark is the book midpoint; if only one side rests, that side's price alone; if the book is empty, zero. A settled series marks at its settlement value, and a pending-review series at intrinsic against spot.

This is worth internalising because **equity, unrealised P\&L and the premium term of margin all reference the mark**. On a thin or one-sided book it is jumpy, and your margin moves with it. The venue's values are authoritative; any greeks or marks you compute client-side are estimates.

***

Pricing and quoting logic is not part of this API and is not documented here. The fields `iv` and `delta` on the chain are annotations the market maker attached — informational, not venue-computed.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.strikelabs.app/protocol/market-structure.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
