Download OpenAPI specification:
The orchestrator brokers quote requests between users and solvers. It exposes REST endpoints to the UI for spot price and for buy / buyback quotes, and a WebSocket server for solvers (documented separately as AsyncAPI).
This service holds no funds and cannot sign commitments. Quote responses are
signed by the winning solver; the UI submits them directly to the on-chain
OptionsMarket contract.
Returns the orchestrator's current view of the asset's spot price. Sourced
from a streaming Pyth Hermes SSE feed. Returns 503 until the upstream
feed delivers its first sample.
{- "asset": "BTC",
- "price": 67432.5,
- "as_of": "2026-05-27T14:30:45.123Z"
}Buy and buyback quoting. The */quote variants return price only; the full variants additionally return a signed commitment ready to submit on-chain.
Broadcasts a buy-quote request to all connected solvers and returns the best (lowest) price. The orchestrator waits a short listening window (~500ms) for solver responses.
This variant does not return a signed commitment. Use /position/open
when the user is ready to submit a transaction.
| asset required | string Asset identifier. Must match a deployed market. Case-normalized. |
| lower_bound | integer or null <int64> Lower price bound in quote-token units. Must be a non-negative
multiple of the per-asset |
| upper_bound | integer or null <int64> Upper price bound in quote-token units. Must be a positive multiple
of the per-asset |
| expire required | string Maturity in UTC, formatted |
{- "asset": "BTC",
- "lower_bound": 50000,
- "upper_bound": 80000,
- "expire": "2026-05-28 18:00"
}{- "request_id": "266ea41d-adf5-480b-af50-15b940c2b846",
- "solver_name": "reference-solver",
- "solver_id": 1,
- "price": 0.42
}Same as /position/open/quote but additionally returns the winning
solver's signed commitment, packed and ready to submit to
OptionsMarket.buy(packed, signature) on-chain.
The commitment binds to the buyer address — only a transaction from
that address can submit it.
| asset required | string Asset identifier. Must match a deployed market. Case-normalized. |
| lower_bound | integer or null <int64> Lower price bound in quote-token units. Must be a non-negative
multiple of the per-asset |
| upper_bound | integer or null <int64> Upper price bound in quote-token units. Must be a positive multiple
of the per-asset |
| expire required | string Maturity in UTC, formatted |
| buyer required | string (EthereumAddress) ^0x[0-9a-fA-F]{40}$ Ethereum address, 0x-prefixed 40-hex (mixed-case checksum accepted). |
| quantity required | integer <int64> >= 1 Number of units to buy. |
{- "asset": "BTC",
- "lower_bound": 50000,
- "upper_bound": 80000,
- "expire": "2026-05-28 18:00",
- "buyer": "0x1234567890AbCdEf1234567890AbCdEf12345678",
- "quantity": 10
}{- "request_id": "266ea41d-adf5-480b-af50-15b940c2b846",
- "solver_name": "reference-solver",
- "solver_id": 1,
- "price": 0.42,
- "commitment_packed": "0x000000000000000000000000000000000000000000000000000000000000000a...",
- "commitment_signature": "0xabc..."
}Broadcasts a buyback-quote request to all connected solvers (including the original issuer) and returns the best (highest) price. Issuers typically win because closing their own position releases their frozen collateral.
| asset required | string |
| solver_id required | integer <int32> >= 0 Issuing solver's registry ID. |
| token_id required | string (TokenID) ^[0-9]+$ ERC-1155 position token ID as a decimal string. The ID packs
|
{- "asset": "BTC",
- "solver_id": 1,
- "token_id": "1234567890123456789012345678901234567890"
}{- "request_id": "266ea41d-adf5-480b-af50-15b940c2b846",
- "solver_name": "reference-solver",
- "solver_id": 1,
- "price": 0.42
}Same as /position/close/quote but additionally returns the winning
solver's signed commitment, ready to submit to
OptionsMarket.buyback(packed, signature) on-chain.
The commitment binds to the user address — only a transaction from
that address can submit it.
| asset required | string |
| solver_id required | integer <int32> >= 0 Issuing solver's registry ID. |
| token_id required | string (TokenID) ^[0-9]+$ ERC-1155 position token ID as a decimal string. The ID packs
|
| user required | string (EthereumAddress) ^0x[0-9a-fA-F]{40}$ Ethereum address, 0x-prefixed 40-hex (mixed-case checksum accepted). |
| quantity required | integer <int64> >= 1 Number of units to sell back. |
{- "asset": "BTC",
- "solver_id": 1,
- "token_id": "1234567890123456789012345678901234567890",
- "user": "0x1234567890AbCdEf1234567890AbCdEf12345678",
- "quantity": 10
}{- "request_id": "266ea41d-adf5-480b-af50-15b940c2b846",
- "solver_name": "reference-solver",
- "solver_id": 1,
- "price": 0.42,
- "commitment_packed": "0x000000000000000000000000000000000000000000000000000000000000000a...",
- "commitment_signature": "0xabc..."
}