{"openapi":"3.1.0","info":{"title":"TickFeed API","description":"Forex and precious-metals market data for trading bots, backtests and AI agents.\n\nAll timestamps are UTC (ISO 8601). `/v1/*` endpoints require an `X-API-Key` header. Usage is prepaid: billable requests are charged to your account balance, and responses carry `X-Request-Cost` and `X-Balance` headers as well as `X-RateLimit-*`. An empty balance returns `402 insufficient_balance`.\n\nMarket data only: no investment advice, no trade execution.","version":"0.1.0"},"paths":{"/health":{"get":{"tags":["system"],"summary":"Health","description":"Service health, reported separately from the HTTP server itself.\n\n* `down` (HTTP 503): the upstream feed is unreachable.\n* `degraded`: a feed is stale during trading hours or the pipeline needs attention.\n* `ok`: everything else, including feeds that are quiet because their market is closed.\n\nExternal callers see the public form (status and per-symbol freshness); the detailed form\nis only returned to local operator requests.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicHealthResponse"}}}},"503":{"description":"Market data feed down"}}}},"/status":{"get":{"tags":["system"],"summary":"Status","description":"Public service status: overall state and per-symbol data freshness (cached for 2 s).\n\nBrowsers (Accept: text/html) get the status page; everything else gets JSON.","operationId":"status_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicHealthResponse"}}}}}}},"/status.json":{"get":{"tags":["system"],"summary":"Status Json","description":"Same as `/status`, always JSON.","operationId":"status_json_status_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicHealthResponse"}}}}}}},"/pricing":{"get":{"tags":["account"],"summary":"Public Pricing","description":"Usage prices. Balances are prepaid; every offered currency uses the same numbers.","operationId":"public_pricing_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/usage":{"get":{"tags":["account"],"summary":"Usage","description":"Your balance, the unit price and the last 30 days of spend. Free.","operationId":"usage_v1_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageResponse"}}}},"401":{"description":"Missing, invalid or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Balance too low for this request (insufficient_balance)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Account inactive","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unsupported symbol","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Market data feed unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/symbols":{"get":{"tags":["market data"],"summary":"List Symbols","description":"Supported symbols, their trading sessions and price precision. Free.","operationId":"list_symbols_v1_symbols_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SymbolsResponse"}}}},"401":{"description":"Missing, invalid or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Balance too low for this request (insufficient_balance)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Account inactive","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unsupported symbol","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Market data feed unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/price/{symbol}":{"get":{"tags":["market data"],"summary":"Get Price","description":"Latest bid/ask.\n\n`freshness`: `fresh` if the tick is at most `stale_after_seconds` old; `market_closed` if older\nbut the market is outside its scheduled session; `stale` if older while the market should be\ntrading (a feed problem). The last known price is returned in every case, clearly labelled.\n\nCost: 1 unit.","operationId":"get_price_v1_price__symbol__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,20}$","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceResponse"}}}},"401":{"description":"Missing, invalid or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Balance too low for this request (insufficient_balance)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Account inactive","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unsupported symbol","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Market data feed unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/prices":{"get":{"tags":["market data"],"summary":"Get Prices","description":"Latest bid/ask for several symbols in one request, each with the same fields and freshness\nlabel as `/v1/price/{symbol}`. Use this instead of one request per pair: it is faster for you\nand counts once against your rate limit.\n\nCost: 1 unit per symbol returned (duplicates are removed).","operationId":"get_prices_v1_prices_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"symbols","in":"query","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._,\\s-]{1,700}$","description":"Comma-separated symbols, e.g. EURUSD,GBPUSD,XAUUSD (up to 30)","title":"Symbols"},"description":"Comma-separated symbols, e.g. EURUSD,GBPUSD,XAUUSD (up to 30)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricesResponse"}}}},"401":{"description":"Missing, invalid or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Balance too low for this request (insufficient_balance)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Account inactive","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unsupported symbol","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Market data feed unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/candles/{symbol}":{"get":{"tags":["market data"],"summary":"Get Candles","description":"OHLC candles in chronological order (oldest first).\n\n* With `start_time`: the first `limit` bars from `start_time` up to `end_time` (or now).\n  If more exist, `truncated` is true and `next_start_time` gives the next page.\n* Without `start_time`: the latest `limit` bars up to `end_time` (or now).\n\nS1, S5, S15 and S30 are built from tick history (about the last six months) and are live only.\nThe most recent bar may still be forming; it is returned with `complete: false`.\nGaps (weekends, breaks, missing history) are never filled.\n\nCost: 1 unit per started block of 100 bars returned (1-100 bars = 1 unit, 101-200 = 2, ...).","operationId":"get_candles_v1_candles__symbol__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,20}$","title":"Symbol"}},{"name":"timeframe","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Timeframe","description":"Bar timeframe","default":"M5"},"description":"Bar timeframe"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":100,"title":"Limit"}},{"name":"start_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO 8601; naive values are treated as UTC","title":"Start Time"},"description":"ISO 8601; naive values are treated as UTC"},{"name":"end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO 8601; naive values are treated as UTC","title":"End Time"},"description":"ISO 8601; naive values are treated as UTC"},{"name":"source","in":"query","required":false,"schema":{"$ref":"#/components/schemas/CandleSource","description":"live = real-time feed, stored = TickFeed stored history","default":"live"},"description":"live = real-time feed, stored = TickFeed stored history"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandlesResponse"}}}},"401":{"description":"Missing, invalid or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Balance too low for this request (insufficient_balance)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Account inactive","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unsupported symbol","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Market data feed unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/ticks/{symbol}":{"get":{"tags":["market data"],"summary":"Get Ticks","description":"Raw tick history: every bid/ask change, timestamped to the millisecond (UTC), oldest first.\n\n* With `start_time`: the first `limit` ticks from `start_time` up to `end_time` (or now).\n  If more exist, `truncated` is true and `next_start_time` gives the next page.\n* Without `start_time`: the latest `limit` ticks up to `end_time` (or now).\n\nHistory covers roughly the last six months (rolling); `notes` gives the exact start for the symbol.\n\nCost: 1 unit per started block of 1,000 ticks returned (1-1,000 ticks = 1 unit, 1,001-2,000 = 2, ...).","operationId":"get_ticks_v1_ticks__symbol__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,20}$","title":"Symbol"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Maximum ticks to return","default":1000,"title":"Limit"},"description":"Maximum ticks to return"},{"name":"start_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO 8601; naive values are treated as UTC","title":"Start Time"},"description":"ISO 8601; naive values are treated as UTC"},{"name":"end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO 8601; naive values are treated as UTC","title":"End Time"},"description":"ISO 8601; naive values are treated as UTC"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicksResponse"}}}},"401":{"description":"Missing, invalid or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Balance too low for this request (insufficient_balance)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Account inactive","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unsupported symbol","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Market data feed unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/candles/{symbol}/gaps":{"get":{"tags":["market data"],"summary":"Get Gaps","description":"Missing intervals in the stored candle history. Cost: 1 unit.","operationId":"get_gaps_v1_candles__symbol__gaps_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]{1,20}$","title":"Symbol"}},{"name":"timeframe","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Timeframe","default":"M5"}},{"name":"start_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time"}},{"name":"end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GapsResponse"}}}},"401":{"description":"Missing, invalid or revoked API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Balance too low for this request (insufficient_balance)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Account inactive","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unsupported symbol","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Market data feed unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"CandleOut":{"properties":{"time":{"type":"string","format":"date-time","title":"Time","description":"Bar open time, UTC."},"open":{"type":"number","title":"Open"},"high":{"type":"number","title":"High"},"low":{"type":"number","title":"Low"},"close":{"type":"number","title":"Close"},"tick_volume":{"type":"integer","title":"Tick Volume"},"spread_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Spread Points","description":"Spread recorded for the bar, in points."},"complete":{"type":"boolean","title":"Complete","description":"False if the bar period had not ended when these values were captured; its values can still change."}},"type":"object","required":["time","open","high","low","close","tick_volume","spread_points","complete"],"title":"CandleOut"},"CandleSource":{"type":"string","enum":["live","stored"],"title":"CandleSource"},"CandlesResponse":{"properties":{"symbol":{"type":"string","title":"Symbol"},"timeframe":{"$ref":"#/components/schemas/Timeframe"},"source":{"$ref":"#/components/schemas/CandleSource"},"count":{"type":"integer","title":"Count"},"truncated":{"type":"boolean","title":"Truncated","description":"True if more bars matched the range than `limit` allowed."},"next_start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Start Time","description":"When truncated with start_time, pass this as start_time to get the next page."},"candles":{"items":{"$ref":"#/components/schemas/CandleOut"},"type":"array","title":"Candles","description":"Chronological, oldest first. No gaps are filled."},"notes":{"items":{"type":"string"},"type":"array","title":"Notes","default":[]}},"type":"object","required":["symbol","timeframe","source","count","truncated","next_start_time","candles"],"title":"CandlesResponse"},"ErrorDetail":{"properties":{"code":{"type":"string","title":"Code","examples":["unsupported_symbol"]},"message":{"type":"string","title":"Message"}},"type":"object","required":["code","message"],"title":"ErrorDetail"},"ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/ErrorDetail"}},"type":"object","required":["error"],"title":"ErrorResponse"},"GapOut":{"properties":{"after":{"type":"string","format":"date-time","title":"After","description":"Open time of the last stored bar before the gap."},"before":{"type":"string","format":"date-time","title":"Before","description":"Open time of the first stored bar after the gap."},"missing_bars":{"type":"integer","title":"Missing Bars"},"expected":{"type":"boolean","title":"Expected","description":"True if every missing bar falls outside scheduled trading hours."},"unexplained_bars":{"type":"integer","title":"Unexplained Bars","description":"Missing bars inside scheduled trading hours."}},"type":"object","required":["after","before","missing_bars","expected","unexplained_bars"],"title":"GapOut"},"GapsResponse":{"properties":{"symbol":{"type":"string","title":"Symbol"},"timeframe":{"$ref":"#/components/schemas/Timeframe"},"stored_bars":{"type":"integer","title":"Stored Bars"},"gaps":{"items":{"$ref":"#/components/schemas/GapOut"},"type":"array","title":"Gaps"},"note":{"type":"string","title":"Note","default":"Gaps are computed from stored bars only and are never filled. 'expected' gaps are market closures per the symbol's schedule. Unexplained gaps can be holidays (not modelled), minutes with no ticks (common on M1), or missing data; the collector periodically re-requests them."}},"type":"object","required":["symbol","timeframe","stored_bars","gaps"],"title":"GapsResponse"},"PriceResponse":{"properties":{"symbol":{"type":"string","title":"Symbol"},"bid":{"type":"number","title":"Bid"},"ask":{"type":"number","title":"Ask"},"spread":{"type":"number","title":"Spread","description":"ask - bid, in price units (quote currency per unit)."},"spread_points":{"type":"integer","title":"Spread Points","description":"Spread in points (1 point = `point` price units)."},"point":{"type":"number","title":"Point"},"tick_time":{"type":"string","format":"date-time","title":"Tick Time","description":"Time of the latest tick, UTC."},"age_seconds":{"type":"number","title":"Age Seconds"},"freshness":{"type":"string","enum":["fresh","market_closed","stale"],"title":"Freshness","description":"fresh: last tick no older than stale_after_seconds. market_closed: older, but the market is outside its scheduled session (or within the grace period right after it opened). stale: older while the market is scheduled to be trading, which indicates a feed problem."},"market_open":{"type":"boolean","title":"Market Open"},"stale_after_seconds":{"type":"integer","title":"Stale After Seconds"},"source":{"type":"string","title":"Source","description":"live = real-time feed; cache = the last real quote, returned while the feed is briefly interrupted (check freshness)","default":"live"}},"type":"object","required":["symbol","bid","ask","spread","spread_points","point","tick_time","age_seconds","freshness","market_open","stale_after_seconds"],"title":"PriceResponse"},"PricesResponse":{"properties":{"prices":{"items":{"$ref":"#/components/schemas/PriceResponse"},"type":"array","title":"Prices","description":"One quote per requested symbol, in request order."}},"type":"object","required":["prices"],"title":"PricesResponse"},"PublicFeed":{"properties":{"symbol":{"type":"string","title":"Symbol"},"market_open":{"type":"boolean","title":"Market Open"},"status":{"type":"string","enum":["fresh","market_closed","stale","unavailable"],"title":"Status","description":"fresh: last tick no older than stale_after_seconds. market_closed: older, but the market is outside its scheduled session (or within the grace period right after it opened). stale: older while the market is scheduled to be trading, which indicates a feed problem."},"last_tick_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Tick Time"},"age_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Age Seconds"}},"type":"object","required":["symbol","market_open","status","last_tick_time","age_seconds"],"title":"PublicFeed"},"PublicHealthResponse":{"properties":{"status":{"type":"string","enum":["ok","degraded","down"],"title":"Status"},"feeds":{"items":{"$ref":"#/components/schemas/PublicFeed"},"type":"array","title":"Feeds"},"checked_at":{"type":"string","format":"date-time","title":"Checked At"}},"type":"object","required":["status","feeds","checked_at"],"title":"PublicHealthResponse","description":"Health as shown to external callers: service state and data freshness, no internals."},"SymbolInfo":{"properties":{"symbol":{"type":"string","title":"Symbol","description":"Public symbol used in API paths."},"available":{"type":"boolean","title":"Available"},"session":{"type":"string","title":"Session","description":"Trading schedule: forex, metals or always."},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"metal, major, minor or exotic."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Readable name, e.g. 'Euro / US Dollar'."},"history_from":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"History From","description":"Open time (UTC) of the oldest stored bar for each timeframe, e.g. {\"H1\": ...}. Use it to check history depth before a backtest."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Same as `name`; kept for compatibility."},"digits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Digits"},"point":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Point","description":"Size of one price point in quote-currency units."},"base_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Currency"},"quote_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quote Currency"}},"type":"object","required":["symbol","available","session"],"title":"SymbolInfo"},"SymbolsResponse":{"properties":{"symbols":{"items":{"$ref":"#/components/schemas/SymbolInfo"},"type":"array","title":"Symbols"},"timeframes":{"items":{"$ref":"#/components/schemas/Timeframe"},"type":"array","title":"Timeframes"}},"type":"object","required":["symbols","timeframes"],"title":"SymbolsResponse"},"TickOut":{"properties":{"time":{"type":"string","title":"Time","description":"Quote time, UTC, ISO 8601 with milliseconds (e.g. 2026-10-30T12:00:00.123Z)."},"bid":{"type":"number","title":"Bid"},"ask":{"type":"number","title":"Ask"}},"type":"object","required":["time","bid","ask"],"title":"TickOut"},"TicksResponse":{"properties":{"symbol":{"type":"string","title":"Symbol"},"count":{"type":"integer","title":"Count"},"truncated":{"type":"boolean","title":"Truncated","description":"True if more ticks matched than `limit` allowed."},"next_start_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Start Time","description":"When truncated with start_time, pass this as start_time to get the next page (no tick is repeated or skipped)."},"ticks":{"items":{"$ref":"#/components/schemas/TickOut"},"type":"array","title":"Ticks","description":"Every bid/ask change, oldest first."},"notes":{"items":{"type":"string"},"type":"array","title":"Notes","default":[]}},"type":"object","required":["symbol","count","truncated","next_start_time","ticks"],"title":"TicksResponse"},"Timeframe":{"type":"string","enum":["S1","S5","S15","S30","M1","M5","M15","M30","H1","H4","D1"],"title":"Timeframe"},"UsageDay":{"properties":{"day":{"type":"string","title":"Day"},"requests":{"type":"integer","title":"Requests","description":"Billable requests that day"},"spent":{"type":"string","title":"Spent","description":"Amount spent that day, formatted in the account currency"},"spent_micros":{"type":"integer","title":"Spent Micros","description":"Amount spent that day, in millionths of the account currency"}},"type":"object","required":["day","requests","spent","spent_micros"],"title":"UsageDay"},"UsageResponse":{"properties":{"billing":{"type":"string","enum":["prepaid","internal"],"title":"Billing","description":"internal = operator key, never charged"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency","description":"Account currency (usd, gbp, eur); null for internal keys"},"balance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Balance","description":"Current balance, formatted, e.g. $12.50"},"balance_micros":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Balance Micros","description":"Current balance in millionths of the currency"},"unit_price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Price","description":"Price of one billing unit, e.g. $0.002"},"unit_price_micros":{"type":"integer","title":"Unit Price Micros"},"candles_per_unit":{"type":"integer","title":"Candles Per Unit","description":"Candle requests cost one unit per this many bars returned"},"ticks_per_unit":{"type":"integer","title":"Ticks Per Unit","description":"Tick requests cost one unit per this many ticks returned","default":1000},"requests_per_minute":{"type":"integer","title":"Requests Per Minute"},"spent_30d":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Spent 30D"},"spent_30d_micros":{"type":"integer","title":"Spent 30D Micros"},"billable_requests_30d":{"type":"integer","title":"Billable Requests 30D"},"history":{"items":{"$ref":"#/components/schemas/UsageDay"},"type":"array","title":"History","description":"Spend per UTC day with billable requests, last 30 days"}},"type":"object","required":["billing","currency","balance","balance_micros","unit_price","unit_price_micros","candles_per_unit","requests_per_minute","spent_30d","spent_30d_micros","billable_requests_30d","history"],"title":"UsageResponse"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","description":"Your API key","in":"header","name":"X-API-Key"}}}}