{"openapi":"3.1.0","jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","info":{"title":"Continuum public read API","version":"1.0.0","description":"Read configured market addresses and raw underlying Pyth spot prices. This API does not quote, sign, or execute trades. This deployment is configured for devnet. Its collateral is a free test token."},"servers":[{"url":"https://continuum.markets"}],"externalDocs":{"description":"Protocol and Solana integration docs","url":"https://docs.continuum.markets"},"security":[],"paths":{"/api/markets":{"get":{"operationId":"listConfiguredMarkets","summary":"List configured Continuum markets","description":"Returns the deployment's market configuration and cluster, including long and short token mints and book addresses. It performs no RPC reads. Presence in this catalog does not establish live liquidity or on-chain availability.","security":[],"responses":{"200":{"description":"Configured market catalog.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketCatalog"}}}},"405":{"description":"This endpoint only supports reads.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiMethodNotAllowed"}}}}}}},"/api/pyth-prices":{"get":{"operationId":"getUnderlyingSpotPrices","summary":"Read raw Pyth spot prices for configured markets","description":"Returns raw underlying-asset spot prices and confidence from the configured Pyth upstream, not Continuum token NAVs or executable quotes. No caller API key is needed; the operator must configure valid Pyth access. Check each feed's timestamp for freshness; data may be cached for five seconds. A failure means prices could not be refreshed. Do not substitute a fabricated price.","security":[],"responses":{"200":{"description":"Underlying spot prices by market symbol.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PythPrices"}}}},"502":{"description":"Pyth request failed or returned invalid data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PythError"}}}},"503":{"description":"Configured Pyth access is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PythError"}}}}}}}},"components":{"schemas":{"ConfiguredMarket":{"type":"object","additionalProperties":false,"required":["symbol","name","longPool","shortPool","longMint","shortMint","url"],"properties":{"symbol":{"type":"string","description":"Configured market symbol, such as QQQ or XAU."},"name":{"type":"string"},"longPool":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"Solana base58 account address on the configured cluster."},"shortPool":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"Solana base58 account address on the configured cluster."},"longMint":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"Solana base58 account address on the configured cluster."},"shortMint":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"Solana base58 account address on the configured cluster."},"lsPool":{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"Optional direct long/short pool address."},"lsPoolTokenX":{"type":"string","enum":["long","short"]},"url":{"type":"string","format":"uri","description":"Browser page for this market."}}},"ApiLinks":{"type":"object","additionalProperties":false,"required":["docs","openapi"],"properties":{"docs":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"}}},"MarketCatalog":{"type":"object","additionalProperties":false,"required":["cluster","source","live","description","markets","links"],"properties":{"cluster":{"type":"string","description":"Cluster configured for this deployment."},"source":{"type":"string","const":"configuration"},"live":{"type":"boolean","const":false,"description":"This response contains configuration, not live market state."},"description":{"type":"string"},"markets":{"type":"array","items":{"$ref":"#/components/schemas/ConfiguredMarket"}},"links":{"$ref":"#/components/schemas/ApiLinks"}}},"PythSpotPrice":{"type":"object","additionalProperties":false,"required":["price","confidence","timestamp"],"properties":{"price":{"type":"number","exclusiveMinimum":0,"description":"Pyth underlying spot price in the feed's quote currency. JPY is USD/JPY; other configured feeds are quoted in USD."},"confidence":{"type":"number","minimum":0,"description":"Pyth confidence value in the same units as price."},"timestamp":{"type":"integer","minimum":1,"description":"Feed publication time as Unix seconds. It may be old when the underlying market is closed."}}},"PythPrices":{"type":"object","additionalProperties":false,"required":["prices","fetchedAt"],"properties":{"prices":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/PythSpotPrice"}},"fetchedAt":{"type":"number","description":"Server fetch time as Unix milliseconds; this is separate from each feed's publication time."}}},"PythError":{"type":"object","description":"Pyth read failure. The server may include additional recovery details.","required":["error","code"],"properties":{"error":{"type":"string"},"code":{"type":"string"}}},"ApiNotFound":{"type":"object","description":"JSON response for an unknown API route. Existing endpoints have their own documented error formats. HEAD returns the same status and headers without a body.","required":["error","links"],"properties":{"error":{"type":"object","required":["code","message","hint"],"properties":{"code":{"type":"string","const":"API_ROUTE_NOT_FOUND"},"message":{"type":"string"},"hint":{"type":"string"}}},"links":{"$ref":"#/components/schemas/ApiLinks"}}},"ApiMethodNotAllowed":{"type":"object","description":"Unsupported method on a public read endpoint. The Allow header lists supported methods.","required":["error","links"],"properties":{"error":{"type":"object","required":["code","message","hint"],"properties":{"code":{"type":"string","const":"METHOD_NOT_ALLOWED"},"message":{"type":"string"},"hint":{"type":"string"}}},"links":{"$ref":"#/components/schemas/ApiLinks"}}}}}}