{
"error": "Too Many Requests",
"message": "Rate limit exceeded. Try again in 7s."
}
{
"error": "Internal Server Error",
"message": "Internal Server Error"
}
{
"error": "Service Unavailable",
"message": "Market hours not available yet"
}
Markets
When each market is open
When each market is tradeable. Returns schedules (unique schedule definitions keyed by numeric id), markets (pair symbol → schedule id), and lastUpdated.
markets keys are unhyphenated and always the current pair name: look up US500USD, not US500-USD and not the legacy SPXUSD.
Use it to show opening hours, day-trading windows and holidays without hard-coding session rules per asset class — equities, FX and crypto differ, and a schedule may be alwaysOpen. Several pairs usually share one schedule, hence the two-part shape: look the pair up in markets, then read that id from schedules.
For whether a market is open right now, prefer the isMarketOpen and isDayTradingClosed fields on a price tick — this endpoint describes the calendar, not live state. Schedules change rarely, so cache the response and refresh periodically rather than per request.
Rate limit: 100 requests per 10 seconds per IP. Read x-ratelimit-* for the live budget rather than assuming this figure.
GET
/
v1
/
market-hours
When each market is open
curl --request GET \ --url https://builder.prod.bedrock.ostium.io/v1/market-hours
Pair to schedule id. Keys are unhyphenated (BTCUSD, not BTC-USD) — the only place in the API where that spelling appears, so strip the hyphen from the symbol you use everywhere else.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Ostium","colors":{"primary":"#FF5A19","light":"#FF5A19","dark":"#FF5A19"},"logo":"https://mintcdn.com/ostium/rgKhfmKxgkO9O2aD/logo/ostium-logo.svg?fit=max\u0026auto=format\u0026n=rgKhfmKxgkO9O2aD\u0026q=85\u0026s=e2316b63df8fab1bbdb3c18daeff80e5","favicon":"https://mintcdn.com/ostium/PYRmOzvp-N2ht7oL/favicon.svg?fit=max\u0026auto=format\u0026n=PYRmOzvp-N2ht7oL\u0026q=85\u0026s=79bfadbe417502d9aec3c62a2a59d62e","navbar":{"links":[{"href":"https://discord.com/invite/ostiumlabs","label":"Support"}],"primary":{"type":"button","label":"Trade Now","href":"https://app.ostium.com"}},"footer":{"socials":{"x":"https://x.com/Ostium","github":"https://github.com/ostium-labs","linkedin":"https://linkedin.com/company/ostium"},"links":[{"header":"Legal","items":[{"label":"Terms of Use","href":"/legal/terms-of-use"},{"label":"Privacy Policy","href":"/legal/privacy-policy"},{"label":"Nasdaq Subscriber Agreement","href":"/legal/nasdaq-subscriber-agreement"},{"label":"OLP Recovery Plan Terms","href":"/legal/olp-recovery-plan-terms"}]}]},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Website","icon":"globe","href":"https://ostium.com"},{"anchor":"Developers","icon":"code","href":"/developer/sdk/overview"},{"anchor":"Blog","icon":"newspaper","href":"https://www.ostium.com/blog"},{"anchor":"X/Twitter","icon":"twitter","href":"https://www.x.com/Ostium"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"ostium","hasAudioNarration":false,"actualSubdomain":"ostium","customDomains":["docs.ostium.com"],"gitSource":{"type":"github","owner":"0xostium","repo":"new-docs","deployBranch":"master","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6acc8e98e4af841eed2f1868","collectionId":"2ac89999-3290-4b13-920e-1ca75a2be88f","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6acc8e98e4af841eed2f1868"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6acc8e98e4af841eed2f1868","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"default","tag":"Developers","count":63},{"language":"default","tag":"Read Methods","count":17},{"language":"default","tag":"API Reference","count":16},{"language":"default","tag":"Traders","count":13},{"language":"default","tag":"Helpers","count":10},{"language":"default","tag":"Client Modes","count":8},{"language":"default","tag":"Builder API","count":7},{"language":"default","tag":"Trading","count":6},{"language":"default","tag":"Write Methods","count":5},{"language":"default","tag":"Previews \u0026 Limits","count":5}]},"assistantConfig":{},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/markets/when-each-market-is-open","slug":"/api-reference/markets/when-each-market-is-open","pageMetadata":{"title":"When each market is open","description":"When each market is tradeable. Returns `schedules` (unique schedule definitions keyed by numeric id), `markets` (pair symbol → schedule id), and `lastUpdated`.\n\n`markets` keys are unhyphenated and always the current pair name: look up `US500USD`, not `US500-USD` and not the legacy `SPXUSD`.\n\nUse it to show opening hours, day-trading windows and holidays without hard-coding session rules per asset class — equities, FX and crypto differ, and a schedule may be `alwaysOpen`. Several pairs usually share one schedule, hence the two-part shape: look the pair up in `markets`, then read that id from `schedules`.\n\nFor whether a market is open *right now*, prefer the `isMarketOpen` and `isDayTradingClosed` fields on a price tick — this endpoint describes the calendar, not live state. Schedules change rarely, so cache the response and refresh periodically rather than per request.\n\nRate limit: 100 requests per 10 seconds per IP. Read `x-ratelimit-*` for the live budget rather than assuming this figure.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/market-hours","href":"/api-reference/markets/when-each-market-is-open","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n em: \"em\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"When each market is tradeable. Returns \", _jsx(_components.code, {\n children: \"schedules\"\n }), \" (unique schedule definitions keyed by numeric id), \", _jsx(_components.code, {\n children: \"markets\"\n }), \" (pair symbol → schedule id), and \", _jsx(_components.code, {\n children: \"lastUpdated\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"markets\"\n }), \" keys are unhyphenated and always the current pair name: look up \", _jsx(_components.code, {\n children: \"US500USD\"\n }), \", not \", _jsx(_components.code, {\n children: \"US500-USD\"\n }), \" and not the legacy \", _jsx(_components.code, {\n children: \"SPXUSD\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Use it to show opening hours, day-trading windows and holidays without hard-coding session rules per asset class — equities, FX and crypto differ, and a schedule may be \", _jsx(_components.code, {\n children: \"alwaysOpen\"\n }), \". Several pairs usually share one schedule, hence the two-part shape: look the pair up in \", _jsx(_components.code, {\n children: \"markets\"\n }), \", then read that id from \", _jsx(_components.code, {\n children: \"schedules\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"For whether a market is open \", _jsx(_components.em, {\n children: \"right now\"\n }), \", prefer the \", _jsx(_components.code, {\n children: \"isMarketOpen\"\n }), \" and \", _jsx(_components.code, {\n children: \"isDayTradingClosed\"\n }), \" fields on a price tick — this endpoint describes the calendar, not live state. Schedules change rarely, so cache the response and refresh periodically rather than per request.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Rate limit: 100 requests per 10 seconds per IP. Read \", _jsx(_components.code, {\n children: \"x-ratelimit-*\"\n }), \" for the live budget rather than assuming this figure.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"When each market is open","description":"When each market is tradeable. Returns `schedules` (unique schedule definitions keyed by numeric id), `markets` (pair symbol → schedule id), and `lastUpdated`.\n\n`markets` keys are unhyphenated and always the current pair name: look up `US500USD`, not `US500-USD` and not the legacy `SPXUSD`.\n\nUse it to show opening hours, day-trading windows and holidays without hard-coding session rules per asset class — equities, FX and crypto differ, and a schedule may be `alwaysOpen`. Several pairs usually share one schedule, hence the two-part shape: look the pair up in `markets`, then read that id from `schedules`.\n\nFor whether a market is open *right now*, prefer the `isMarketOpen` and `isDayTradingClosed` fields on a price tick — this endpoint describes the calendar, not live state. Schedules change rarely, so cache the response and refresh periodically rather than per request.\n\nRate limit: 100 requests per 10 seconds per IP. Read `x-ratelimit-*` for the live budget rather than assuming this figure.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/market-hours","href":"/api-reference/markets/when-each-market-is-open","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"When each market is open","description":"When each market is tradeable. Returns `schedules` (unique schedule definitions keyed by numeric id), `markets` (pair symbol → schedule id), and `lastUpdated`.\n\n`markets` keys are unhyphenated and always the current pair name: look up `US500USD`, not `US500-USD` and not the legacy `SPXUSD`.\n\nUse it to show opening hours, day-trading windows and holidays without hard-coding session rules per asset class — equities, FX and crypto differ, and a schedule may be `alwaysOpen`. Several pairs usually share one schedule, hence the two-part shape: look the pair up in `markets`, then read that id from `schedules`.\n\nFor whether a market is open *right now*, prefer the `isMarketOpen` and `isDayTradingClosed` fields on a price tick — this endpoint describes the calendar, not live state. Schedules change rarely, so cache the response and refresh periodically rather than per request.\n\nRate limit: 100 requests per 10 seconds per IP. Read `x-ratelimit-*` for the live budget rather than assuming this figure.","tags":["Markets"],"responses":{"200":"3743175b-8f6e-4702-b8c0-a860a334117b","400":"c11217e6-4c90-4003-9d42-fe722b9ec7fd","429":"8aa0e885-7dcb-48d5-8050-807fe604a063","500":"efd78830-b7fe-4cc2-b140-228983a0565f","503":"476b3bf1-f8ce-4d8a-99cc-a553d4e758b5"},"method":"get","type":"path","servers":["35ccf0da-4e4c-4ce1-a160-3dfb930fa193","14a6e080-29f2-4577-ab29-a205a0e38f12"],"security":[],"path":"/v1/market-hours","baseUrlOptions":["https://builder.prod.bedrock.ostium.io","https://builder.stage.bedrock.ostium.io"],"title":"When each market is open","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"responses":{"3743175b-8f6e-4702-b8c0-a860a334117b":{"description":"Normalized schedule cache","headers":{"x-request-id":{"schema":{"type":"string"},"description":"Always present, and always generated by the service — a value sent on the request is ignored. Use it to correlate a response with your own logs, and quote it when reporting a problem."},"x-ratelimit-limit":{"schema":{"type":"string"},"description":"Requests allowed per window."},"x-ratelimit-remaining":{"schema":{"type":"string"},"description":"Requests left in the current window."},"x-ratelimit-reset":{"schema":{"type":"string"},"description":"Seconds until the window resets."}},"content":{"application/json":{"schema":{"type":"object","properties":{"schedules":{"type":"object","additionalProperties":{"type":"object","properties":{"id":{"type":"integer","description":"Numeric schedule id referenced by `markets`","example":1,"isRequired":true,"uniqueKey":"schedules.additionalProperties.id","typeLabel":"integer"},"alwaysOpen":{"type":"boolean","enum":[true],"description":"When true, the market has no session calendar","uniqueKey":"schedules.additionalProperties.alwaysOpen","typeLabel":"enum\u003cboolean>"},"timezone":{"type":"string","description":"IANA timezone for opening hours","example":"America/New_York","uniqueKey":"schedules.additionalProperties.timezone","typeLabel":"string"},"openingHours":{"type":"array","items":{"type":"string","uniqueKey":"schedules.additionalProperties.openingHours.items.[INDEX]","typeLabel":"string"},"description":"Weekly session windows in the schedule timezone, passed through from upstream. Day-name ranges (`Mo-Fr`), and one entry may carry several comma-separated windows.","example":["Mo-Th 00:00-24:00","Fr 00:00-16:59","Su 17:00-24:00"],"uniqueKey":"schedules.additionalProperties.openingHours","typeLabel":"string[]"},"dayTradingHours":{"type":"object","properties":{"from":{"type":"string","example":"09:30","isRequired":true,"uniqueKey":"schedules.additionalProperties.dayTradingHours.from","typeLabel":"string"},"to":{"type":"string","example":"16:00","isRequired":true,"uniqueKey":"schedules.additionalProperties.dayTradingHours.to","typeLabel":"string"}},"required":["from","to"],"description":"Intraday day-trading window when applicable","uniqueKey":"schedules.additionalProperties.dayTradingHours","typeLabel":"object"}},"required":["id"],"uniqueKey":"schedules.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"schedules","typeLabel":"object"},"markets":{"type":"object","additionalProperties":{"type":"integer","uniqueKey":"markets.additionalProperties","typeLabel":"integer"},"description":"Pair to schedule id. Keys are unhyphenated (`BTCUSD`, not `BTC-USD`) — the only place in the API where that spelling appears, so strip the hyphen from the symbol you use everywhere else.","isRequired":true,"uniqueKey":"markets","typeLabel":"object"},"lastUpdated":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"lastUpdated","typeLabel":"string\u003cdate-time>"}},"required":["schedules","markets","lastUpdated"],"uniqueKey":"","typeLabel":"object"},"example":{"schedules":{"1":{"id":1,"alwaysOpen":true},"2":{"id":2,"timezone":"America/New_York","openingHours":["Mo-Th 00:00-24:00","Fr 00:00-16:59","Su 17:00-24:00"],"dayTradingHours":{"from":"09:30","to":"16:00"}}},"markets":{"BTCUSD":1,"EURUSD":2,"US500USD":2},"lastUpdated":"2026-03-20T12:00:00.000Z"},"examples":{"Example":{"title":"Example","value":{"schedules":{"1":{"id":1,"alwaysOpen":true},"2":{"id":2,"timezone":"America/New_York","openingHours":["Mo-Th 00:00-24:00","Fr 00:00-16:59","Su 17:00-24:00"],"dayTradingHours":{"from":"09:30","to":"16:00"}}},"markets":{"BTCUSD":1,"EURUSD":2,"US500USD":2},"lastUpdated":"2026-03-20T12:00:00.000Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"c11217e6-4c90-4003-9d42-fe722b9ec7fd":{"description":"Validation failed","headers":{"x-request-id":{"schema":{"type":"string"},"description":"Always present, and always generated by the service — a value sent on the request is ignored. Use it to correlate a response with your own logs, and quote it when reporting a problem."},"x-ratelimit-limit":{"schema":{"type":"string"},"description":"Requests allowed per window."},"x-ratelimit-remaining":{"schema":{"type":"string"},"description":"Requests left in the current window."},"x-ratelimit-reset":{"schema":{"type":"string"},"description":"Seconds until the window resets."}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"HTTP status name, e.g. \"Bad Request\"","example":"Bad Request","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","description":"Human-readable detail","example":"Validation failed","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"issues":{"type":"array","items":{"oneOf":[{}],"uniqueKey":"issues.items.[INDEX]","typeLabel":"any"},"description":"Raw zod issue array — present on validation failures only","uniqueKey":"issues","typeLabel":"any[]"},"details":{"description":"Optional structured detail from the thrower","uniqueKey":"details","typeLabel":"any"}},"required":["error","message"],"uniqueKey":"","typeLabel":"object"},"example":{"error":"Bad Request","message":"Validation failed","issues":[]},"examples":{"Example":{"title":"Example","value":{"error":"Bad Request","message":"Validation failed","issues":[]}}},"exampleType":"examples"}},"exampleType":"examples"},"8aa0e885-7dcb-48d5-8050-807fe604a063":{"description":"Rate limit exceeded","headers":{"x-request-id":{"schema":{"type":"string"},"description":"Always present, and always generated by the service — a value sent on the request is ignored. Use it to correlate a response with your own logs, and quote it when reporting a problem."},"x-ratelimit-limit":{"schema":{"type":"string"},"description":"Requests allowed per window."},"x-ratelimit-remaining":{"schema":{"type":"string"},"description":"Requests left in the current window."},"x-ratelimit-reset":{"schema":{"type":"string"},"description":"Seconds until the window resets."},"retry-after":{"schema":{"type":"string"},"description":"Seconds to wait before retrying."}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"HTTP status name, e.g. \"Bad Request\"","example":"Bad Request","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","description":"Human-readable detail","example":"Validation failed","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"issues":{"type":"array","items":{"oneOf":[{}],"uniqueKey":"issues.items.[INDEX]","typeLabel":"any"},"description":"Raw zod issue array — present on validation failures only","uniqueKey":"issues","typeLabel":"any[]"},"details":{"description":"Optional structured detail from the thrower","uniqueKey":"details","typeLabel":"any"}},"required":["error","message"],"uniqueKey":"","typeLabel":"object"},"example":{"error":"Too Many Requests","message":"Rate limit exceeded. Try again in 7s."},"examples":{"Example":{"title":"Example","value":{"error":"Too Many Requests","message":"Rate limit exceeded. Try again in 7s."}}},"exampleType":"examples"}},"exampleType":"examples"},"efd78830-b7fe-4cc2-b140-228983a0565f":{"description":"Unexpected error","headers":{"x-request-id":{"schema":{"type":"string"},"description":"Always present, and always generated by the service — a value sent on the request is ignored. Use it to correlate a response with your own logs, and quote it when reporting a problem."},"x-ratelimit-limit":{"schema":{"type":"string"},"description":"Requests allowed per window."},"x-ratelimit-remaining":{"schema":{"type":"string"},"description":"Requests left in the current window."},"x-ratelimit-reset":{"schema":{"type":"string"},"description":"Seconds until the window resets."}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"HTTP status name, e.g. \"Bad Request\"","example":"Bad Request","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","description":"Human-readable detail","example":"Validation failed","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"issues":{"type":"array","items":{"oneOf":[{}],"uniqueKey":"issues.items.[INDEX]","typeLabel":"any"},"description":"Raw zod issue array — present on validation failures only","uniqueKey":"issues","typeLabel":"any[]"},"details":{"description":"Optional structured detail from the thrower","uniqueKey":"details","typeLabel":"any"}},"required":["error","message"],"uniqueKey":"","typeLabel":"object"},"example":{"error":"Internal Server Error","message":"Internal Server Error"},"examples":{"Example":{"title":"Example","value":{"error":"Internal Server Error","message":"Internal Server Error"}}},"exampleType":"examples"}},"exampleType":"examples"},"476b3bf1-f8ce-4d8a-99cc-a553d4e758b5":{"description":"Schedules not available yet — retry","headers":{"x-request-id":{"schema":{"type":"string"},"description":"Always present, and always generated by the service — a value sent on the request is ignored. Use it to correlate a response with your own logs, and quote it when reporting a problem."},"x-ratelimit-limit":{"schema":{"type":"string"},"description":"Requests allowed per window."},"x-ratelimit-remaining":{"schema":{"type":"string"},"description":"Requests left in the current window."},"x-ratelimit-reset":{"schema":{"type":"string"},"description":"Seconds until the window resets."}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"HTTP status name, e.g. \"Bad Request\"","example":"Bad Request","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"message":{"type":"string","description":"Human-readable detail","example":"Validation failed","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"issues":{"type":"array","items":{"oneOf":[{}],"uniqueKey":"issues.items.[INDEX]","typeLabel":"any"},"description":"Raw zod issue array — present on validation failures only","uniqueKey":"issues","typeLabel":"any[]"},"details":{"description":"Optional structured detail from the thrower","uniqueKey":"details","typeLabel":"any"}},"required":["error","message"],"uniqueKey":"","typeLabel":"object"},"example":{"error":"Service Unavailable","message":"Market hours not available yet"},"examples":{"Example":{"title":"Example","value":{"error":"Service Unavailable","message":"Market hours not available yet"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{},"servers":{"35ccf0da-4e4c-4ce1-a160-3dfb930fa193":{"url":"https://builder.prod.bedrock.ostium.io","description":"Production (Arbitrum One)"},"14a6e080-29f2-4577-ab29-a205a0e38f12":{"url":"https://builder.stage.bedrock.ostium.io","description":"Staging (Arbitrum Sepolia)"}}},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"ostium","siteName":"Ostium","title":"When each market is open - Ostium","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-17T13:14:46.740Z","originalFileLocation":"api-reference/markets/when-each-market-is-open.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"When each market is tradeable. Returns schedules (unique schedule definitions keyed by numeric id), markets (pair symbol → schedule id), and lastUpdated. markets keys are unhyphenated and always the current pair name: look up US500USD, not US500-USD and not the legacy SPXUSD. Use it to show opening hours, day-trading windows and holidays without hard-coding session rules per asset class — equities, FX and crypto differ, and a schedule may be alwaysOpen. Several pairs usually share one schedule, hence the two-part shape: look the pair up in markets, then read that id from schedules. For whether a market is open right now, prefer the isMarketOpen and isDayTradingClosed fields on a price tick — this endpoint describes the calendar, not live state. Schedules change rarely, so cache the response and refresh periodically rather than per request. Rate limit: 100 requests per 10 seconds per IP. Read x-ratelimit-* for the live budget rather than assuming this figure.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Ostium\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/ostium/YrHQiGdYpiT2HO80/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/ostium/YrHQiGdYpiT2HO80/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/ostium/YrHQiGdYpiT2HO80/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/ostium/YrHQiGdYpiT2HO80/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/ostium/YrHQiGdYpiT2HO80/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/ostium/YrHQiGdYpiT2HO80/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/ostium/YrHQiGdYpiT2HO80/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/ostium/YrHQiGdYpiT2HO80/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/ostium/YrHQiGdYpiT2HO80/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"When each market is open - Ostium\">\u003cmeta data-mint-head property=\"og:description\" content=\"When each market is tradeable. Returns schedules (unique schedule definitions keyed by numeric id), markets (pair symbol → schedule id), and lastUpdated. markets keys are unhyphenated and always the current pair name: look up US500USD, not US500-USD and not the legacy SPXUSD. Use it to show opening hours, day-trading windows and holidays without hard-coding session rules per asset class — equities, FX and crypto differ, and a schedule may be alwaysOpen. Several pairs usually share one schedule, hence the two-part shape: look the pair up in markets, then read that id from schedules. For whether a market is open right now, prefer the isMarketOpen and isDayTradingClosed fields on a price tick — this endpoint describes the calendar, not live state. Schedules change rarely, so cache the response and refresh periodically rather than per request. Rate limit: 100 requests per 10 seconds per IP. Read x-ratelimit-* for the live budget rather than assuming this figure.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Ostium\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.ostium.com/api-reference/markets/when-each-market-is-open\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://ostium.mintlify.app/_mintlify/api/og/v2?division=Markets\u0026amp;title=When+each+market+is+open\u0026amp;description=When+each+market+is+tradeable.+Returns+%60schedules%60+%28unique+schedule+definitions+keyed+by+numeric+id%29%2C+%60markets%60+%28pair+symbol+%E2%86%92+schedule+id%29%2C+and+%60lastUpdated%60.%0A\u0026amp;theme=4c59edf2484b017f3ed2d875\u0026amp;signature=a74156c38ad427a2a25ae840d798e2a48658586e31b4c1047c05374ab4c8e6b3\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"When each market is open - Ostium\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"When each market is tradeable. Returns schedules (unique schedule definitions keyed by numeric id), markets (pair symbol → schedule id), and lastUpdated. markets keys are unhyphenated and always the current pair name: look up US500USD, not US500-USD and not the legacy SPXUSD. Use it to show opening hours, day-trading windows and holidays without hard-coding session rules per asset class — equities, FX and crypto differ, and a schedule may be alwaysOpen. Several pairs usually share one schedule, hence the two-part shape: look the pair up in markets, then read that id from schedules. For whether a market is open right now, prefer the isMarketOpen and isDayTradingClosed fields on a price tick — this endpoint describes the calendar, not live state. Schedules change rarely, so cache the response and refresh periodically rather than per request. Rate limit: 100 requests per 10 seconds per IP. Read x-ratelimit-* for the live budget rather than assuming this figure.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://ostium.mintlify.app/_mintlify/api/og/v2?division=Markets\u0026amp;title=When+each+market+is+open\u0026amp;description=When+each+market+is+tradeable.+Returns+%60schedules%60+%28unique+schedule+definitions+keyed+by+numeric+id%29%2C+%60markets%60+%28pair+symbol+%E2%86%92+schedule+id%29%2C+and+%60lastUpdated%60.%0A\u0026amp;theme=4c59edf2484b017f3ed2d875\u0026amp;signature=a74156c38ad427a2a25ae840d798e2a48658586e31b4c1047c05374ab4c8e6b3\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/ostium/YrHQiGdYpiT2HO80/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Ostium\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#FF5A19\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.ostium.com/api-reference/markets/when-each-market-is-open\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/markets/when-each-market-is-open.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.ostium.com/#organization\",\"name\":\"Ostium\",\"url\":\"https://docs.ostium.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/ostium/rgKhfmKxgkO9O2aD/logo/ostium-logo.svg?fit=max\u0026auto=format\u0026n=rgKhfmKxgkO9O2aD\u0026q=85\u0026s=e2316b63df8fab1bbdb3c18daeff80e5\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.ostium.com#website\",\"name\":\"Ostium\",\"url\":\"https://docs.ostium.com\",\"publisher\":{\"@id\":\"https://docs.ostium.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.ostium.com/api-reference/markets/when-each-market-is-open#webpage\",\"url\":\"https://docs.ostium.com/api-reference/markets/when-each-market-is-open\",\"name\":\"When each market is open\",\"description\":\"When each market is tradeable. Returns schedules (unique schedule definitions keyed by numeric id), markets (pair symbol → schedule id), and lastUpdated. markets keys are unhyphenated and always the current pair name: look up US500USD, not US500-USD and not the legacy SPXUSD. Use it to show opening hours, day-trading windows and holidays without hard-coding session rules per asset class — equities, FX and crypto differ, and a schedule may be alwaysOpen. Several pairs usually share one schedule, hence the two-part shape: look the pair up in markets, then read that id from schedules. For whether a market is open right now, prefer the isMarketOpen and isDayTradingClosed fields on a price tick — this endpoint describes the calendar, not live state. Schedules change rarely, so cache the response and refresh periodically rather than per request. Rate limit: 100 requests per 10 seconds per IP. Read x-ratelimit-* for the live budget rather than assuming this figure.\",\"dateModified\":\"2026-09-17T13:14:46.740Z\",\"isPartOf\":{\"@id\":\"https://docs.ostium.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.ostium.com/api-reference/markets/when-each-market-is-open#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.ostium.com/api-reference/markets/when-each-market-is-open#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Markets\",\"item\":\"https://docs.ostium.com/api-reference/markets\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"When each market is open\",\"item\":\"https://docs.ostium.com/api-reference/markets/when-each-market-is-open\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.ostium.com/api-reference/markets/when-each-market-is-open#apireference\",\"headline\":\"When each market is open\",\"name\":\"When each market is open\",\"description\":\"When each market is tradeable. Returns schedules (unique schedule definitions keyed by numeric id), markets (pair symbol → schedule id), and lastUpdated. markets keys are unhyphenated and always the current pair name: look up US500USD, not US500-USD and not the legacy SPXUSD. Use it to show opening hours, day-trading windows and holidays without hard-coding session rules per asset class — equities, FX and crypto differ, and a schedule may be alwaysOpen. Several pairs usually share one schedule, hence the two-part shape: look the pair up in markets, then read that id from schedules. For whether a market is open right now, prefer the isMarketOpen and isDayTradingClosed fields on a price tick — this endpoint describes the calendar, not live state. Schedules change rarely, so cache the response and refresh periodically rather than per request. Rate limit: 100 requests per 10 seconds per IP. Read x-ratelimit-* for the live budget rather than assuming this figure.\",\"url\":\"https://docs.ostium.com/api-reference/markets/when-each-market-is-open\",\"mainEntityOfPage\":{\"@id\":\"https://docs.ostium.com/api-reference/markets/when-each-market-is-open#webpage\"},\"dateModified\":\"2026-09-17T13:14:46.740Z\",\"publisher\":{\"@id\":\"https://docs.ostium.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.ostium.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Ostium\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Ostium","nav":{"global":{"anchors":[{"anchor":"Website","icon":"globe","href":"https://ostium.com"},{"anchor":"Developers","icon":"code","href":"/developer/sdk/overview"},{"anchor":"Blog","icon":"newspaper","href":"https://www.ostium.com/blog"},{"anchor":"X/Twitter","icon":"twitter","href":"https://www.x.com/Ostium"}]},"tabs":[{"tab":"Traders","pages":[{"title":"Traders","href":"/traders/welcome"}]},{"tab":"Vault","pages":[{"title":"Vault","href":"/vault/overview"}]},{"tab":"Protocol","pages":[{"title":"Protocol","href":"/protocol/how-ostium-works"}]},{"tab":"Developers","pages":[{"title":"Developers","href":"/developer/sdk/overview"}]},{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"Overview","href":"/api-reference/overview"}]},{"group":"Prices","pages":[{"title":"Latest price for every pair","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/prices","href":"/api-reference/prices/latest-price-for-every-pair"},{"title":"Latest price for one pair","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/prices/{pair}","href":"/api-reference/prices/latest-price-for-one-pair"},{"title":"OHLC candles","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/ohlc","href":"/api-reference/prices/ohlc-candles"},{"title":"Price Stream","href":"/api-reference/price-stream"}]},{"group":"Liquidity","pages":[{"title":"Price for a given trade size","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/depth/{pair}/quote","href":"/api-reference/liquidity/price-for-a-given-trade-size"},{"title":"Price across a range of trade sizes","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/depth/{pair}","href":"/api-reference/liquidity/price-across-a-range-of-trade-sizes"}]},{"group":"Markets","pages":[{"title":"Markets","href":"/api-reference/markets"},{"title":"Every listed pair and its live state","description":"What is tradeable, and the limits that apply to it. Use it to build a market list, or to check leverage bounds and remaining capacity before sending an order.\n\n**`id` is the `pairIndex`** an order intent signs — this endpoint is where you get it. Do not derive it by counting rows in a table.\n\nTwo names per pair, deliberately. `from`/`to` are the subgraph's spelling, which for nine renamed instruments is the legacy one (`SPX`, `CL`, `HG`); `symbol` is what the price and depth endpoints expect (`US500-USD`, `WTI-USD`, `XCU-USD`). Join on `symbol`.\n\nThis is the on-chain view. For the bid/mid/ask a trade would price against use `GET /v1/prices`; for what a given size actually costs use `GET /v1/depth/{pair}/quote`.\n\n### Reading a pair\n\n```json\n{\n \"from\": \"BTC\",\n \"to\": \"USD\",\n \"maxLeverage\": 100,\n \"minLeverage\": 1,\n \"lastTradePrice\": 78502.04,\n \"longOIInUnits\": 0.783,\n \"maxOIInUsd\": 6000000,\n \"totalOpenTrades\": \"182\"\n}\n```\n\n**Open interest and its cap are on different scales.** `longOIInUnits` and `shortOIInUnits` are quantities of the base asset; `maxOIInUsd` is a USD ceiling. To compare them, multiply the unit figures by `lastTradePrice` first — here 0.783 BTC is about $61k against a $6M cap.\n\n`maxLeverage` is the limit that actually applies to this pair: most pairs inherit their group's, and the few that are capped lower override it. `minLeverage` comes from the group.\n\n`from`/`to` are the subgraph's spelling, which for renamed assets is the legacy one — `SPX`, where every other endpoint says `US500`.\n\nRate limit: 60 requests per 10 seconds per IP. This budget is **shared across `/v1/pairs`, `/v1/trades`, `/v1/limits` and `GET /v1/orders`**, not counted per path. Read `x-ratelimit-*` for the live budget rather than assuming this figure.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/pairs","href":"/api-reference/markets/every-listed-pair-and-its-live-state"},{"title":"When each market is open","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/market-hours","href":"/api-reference/markets/when-each-market-is-open"}]},{"group":"Portfolio","pages":[{"title":"Open positions for a wallet","description":"What the wallet is holding right now, newest first. A position appears the moment it fills and disappears the moment it closes — its closing fill then shows up in `GET /v1/orders`.\n\n### Reading a position\n\n```json\n{\n \"tradeID\": \"151146\",\n \"isBuy\": true,\n \"openPrice\": 77498.43,\n \"collateral\": 49.2,\n \"notionalInUsd\": 492,\n \"notionalInUnits\": 0.00634851,\n \"leverage\": 10,\n \"openingFee\": 0.8,\n \"pair\": { \"id\": \"0\", \"from\": \"BTC\", \"to\": \"USD\" }\n}\n```\n\nA 10x long on BTC-USD: 49.2 USDC of margin controlling 492 USD of exposure, which at an entry of 77,498.43 is 0.00634851 BTC. It cost 0.80 USDC to open.\n\n| Field | Means |\n| --- | --- |\n| `notionalInUsd` | Position size in USD — `collateral × leverage` |\n| `notionalInUnits` | The same size as a quantity of the base asset |\n| `openingFee` | Total charged at open, in USDC |\n| `builder` / `builderFee` | The builder code the trade was opened with, and its fee |\n| `isDayTrade` | Opened under day-trade margin, which closes at session end |\n\n`tradeID` is the handle you pass back to `POST /v1/orders` to close it.\n\n### Unrealized PnL\n\nEach position is also valued against the live mid price:\n\n| Field | Means |\n| --- | --- |\n| `markPrice` | Mid price the position was valued at |\n| `unrealizedPnl` | Price PnL, in USDC — capped at +900% / -100% of collateral |\n| `fundingFee` | Funding accrued so far. Positive is owed by the position |\n| `rolloverFee` | Rollover accrued so far. Positive is owed by the position |\n| `netPnl` | `unrealizedPnl - fundingFee - rolloverFee` |\n| `netPnlPercent` | `netPnl` over collateral, floored at -100% |\n| `netPnlAfterOpeningFee` | `netPnl - openingFee` |\n| `netPnlPercentAfterOpeningFee` | Over collateral, not floored |\n| `netValue` | `collateral + netPnl` |\n| `liquidationPrice` | Price at which the position liquidates, `null` if underivable |\n\n`collateral` is already net of `openingFee`, so use `netPnl` to measure the trade and `netPnlAfterOpeningFee` to measure the deposit.\n\n**Funding and rollover are reported as of the pair's last on-chain update** when that update is more than ~50,000 blocks old (roughly 3.5 hours). On a pair that quiet the two fees stop accruing in this response and step forward when the next trade on that pair lands — a close still settles the full amount. This matches what the Ostium UI shows.\n\n**Not a close quote.** `markPrice` is the feed mid, not either side of the book, and `netValue` deducts neither the spread nor the closing fee. Price a real close with `GET /v1/depth/{pair}/quote`.\n\n**The block may be absent.** When a position cannot be priced — no live price for the pair, or pair data briefly unavailable — all ten fields are omitted rather than returned as `0`, so test for `netPnl` instead of reading a missing block as flat. The position itself is always returned. A closed market still prices, from the last quote before close.\n\nWithin a present block, `liquidationPrice` is the one field that can independently be `null` (a pair with no leverage cap configured). It is never `0` for that case, because on a long that would read as \"only liquidates if the market goes to zero\".\n\nRate limit: 60 requests per 10 seconds per IP. This budget is **shared across `/v1/pairs`, `/v1/trades`, `/v1/limits` and `GET /v1/orders`**, not counted per path. Read `x-ratelimit-*` for the live budget rather than assuming this figure.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/trades","href":"/api-reference/portfolio/open-positions-for-a-wallet"},{"title":"Limit/stop orders for a wallet","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/limits","href":"/api-reference/portfolio/limitstop-orders-for-a-wallet"},{"title":"Order history for a wallet","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/orders","href":"/api-reference/portfolio/order-history-for-a-wallet"}]},{"group":"Orders","pages":[{"title":"One-time onboarding (gasless)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/onboard","href":"/api-reference/orders/one-time-onboarding-gasless"},{"title":"Submit an order","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/orders","href":"/api-reference/orders/submit-an-order"}]},{"group":"Status","pages":[{"title":"Service status","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/status","href":"/api-reference/status/service-status"}]}]}]},"title":"When each market is open - Ostium","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DKJwRUt2.js","utils-CWD_VS3u.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-oFjciODD.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-C76WsxC3.js","snippetPresets-DvPMxpX_.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CuNQfndH.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BVFpVUoF.js","shallow-t59Jg5Kr.js","getApiPlaygroundDisplay-C_JZ4amX.js","CodeSnippet-CLRDnx_h.js","CodeSnippets-C2myU4kc.js","Page-7TwLLapg.js","getPastedJson-B-JaVXw7.js","icon-BA-iDhH3.js","MethodPill-D4qZABFp.js","DuplicateIcon-THIDKO1O.js","createIcon-CYYJwgFd.js","DynamicMarkdown-UGQuxDKp.js","SectionHeading-jYELb23h.js","axios-vUo_bRtp.js","Markdown-DKsLa3wy.js","clsx-CefdjKz2.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BaREnp3o.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-sgx_0XzF.js"]}