{"openapi":"3.0.1","info":{"title":"Forex & Market Data API Gateway","description":"Real-time and historical Forex, Metals, Crypto, Indices, Stocks, News, and Economic Calendar API. Base URL: https://api.upirecharge.online | SignalR Hub: https://api.upirecharge.online/hubs/tick | JSON WebSocket: wss://api.upirecharge.online/ws","contact":{"name":"API Gateway","url":"https://api.upirecharge.online"},"version":"v1.0"},"servers":[{"url":"https://api.upirecharge.online","description":"Active Gateway Base URL"}],"paths":{"/api/Calendar":{"get":{"tags":["Calendar"],"summary":"Get calendar events in a date range.","parameters":[{"name":"from","in":"query","description":"Start of range, UTC (ISO 8601). Defaults to yesterday.","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","description":"End of range, UTC (ISO 8601). Defaults to seven days out.","schema":{"type":"string","format":"date-time"}},{"name":"countries","in":"query","description":"Comma-separated ISO alpha-2 codes, e.g. \"US,EU,TR\". Omit for all.","schema":{"type":"string"}},{"name":"importance","in":"query","description":"Minimum importance: low, medium or high. Omit for all.","schema":{"type":"string"}},{"name":"type","in":"query","description":"event, indicator or holiday. Omit for all.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum rows (1-500).","schema":{"type":"integer","format":"int32","default":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CalendarEvent"}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/Calendar/upcoming":{"get":{"tags":["Calendar"],"summary":"Get the next scheduled releases from now.","parameters":[{"name":"limit","in":"query","description":"Maximum rows (1-500).","schema":{"type":"integer","format":"int32","default":20}},{"name":"countries","in":"query","description":"Comma-separated ISO alpha-2 codes. Omit for all.","schema":{"type":"string"}},{"name":"importance","in":"query","description":"Minimum importance: low, medium or high. Omit for all.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CalendarEvent"}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/Calendar/countries":{"get":{"tags":["Calendar"],"summary":"Get the countries the calendar currently carries.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CalendarCountry"}}}}}}}},"/api/Calendar/{eventId}/history":{"get":{"tags":["Calendar"],"summary":"Get past releases of one recurring series, so a figure can be read\r\nagainst its own history rather than a single previous print.","parameters":[{"name":"eventId","in":"path","description":"Series id, as returned in the eventId field (e.g. \"mql5:840\").","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum rows (1-500).","schema":{"type":"integer","format":"int32","default":24}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CalendarEvent"}}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/Health":{"get":{"tags":["Health"],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/HealthResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/Health/live":{"get":{"tags":["Health"],"responses":{"200":{"description":"OK"}}}},"/Health/ready":{"get":{"tags":["Health"],"responses":{"200":{"description":"OK"}}}},"/api/Market/gainers":{"get":{"tags":["Market"],"summary":"Get top gaining symbols sorted by percentage change","parameters":[{"name":"type","in":"query","description":"Filter by symbol type (Forex, Stock, Crypto, etc.)","schema":{"enum":["Forex","Stock","Index","Commodity","Crypto","Future","Option","CFD"],"type":"string"}},{"name":"exchange","in":"query","description":"Filter by exchange name","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum number of results (1-100)","schema":{"type":"integer","format":"int32","default":10}},{"name":"period","in":"query","description":"Time period (1H, 4H, 1D, 1W)","schema":{"type":"string","default":"1D"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GainerLoserResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/Market/losers":{"get":{"tags":["Market"],"summary":"Get top losing symbols sorted by percentage change","parameters":[{"name":"type","in":"query","description":"Filter by symbol type (Forex, Stock, Crypto, etc.)","schema":{"enum":["Forex","Stock","Index","Commodity","Crypto","Future","Option","CFD"],"type":"string"}},{"name":"exchange","in":"query","description":"Filter by exchange name","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum number of results (1-100)","schema":{"type":"integer","format":"int32","default":10}},{"name":"period","in":"query","description":"Time period (1H, 4H, 1D, 1W)","schema":{"type":"string","default":"1D"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GainerLoserResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/Market/most-active":{"get":{"tags":["Market"],"summary":"Get the symbols that moved the most today, ranked by relative intraday range","parameters":[{"name":"metric","in":"query","description":"Kept for URL compatibility — ranking is always range-based (no traded volume on this feed)","schema":{"enum":["Volume","Turnover"],"type":"string","default":"Volume"}},{"name":"type","in":"query","description":"Filter by symbol type (Forex, Stock, Crypto, etc.)","schema":{"enum":["Forex","Stock","Index","Commodity","Crypto","Future","Option","CFD"],"type":"string"}},{"name":"exchange","in":"query","description":"Filter by exchange name","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum number of results (1-100)","schema":{"type":"integer","format":"int32","default":10}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MostActiveResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/Market/summary":{"get":{"tags":["Market"],"summary":"Get market overview and summary statistics","parameters":[{"name":"type","in":"query","description":"Filter by symbol type (Forex, Stock, Crypto, etc.)","schema":{"enum":["Forex","Stock","Index","Commodity","Crypto","Future","Option","CFD"],"type":"string"}},{"name":"exchange","in":"query","description":"Filter by exchange name","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketSummaryResponse"}}}}}}},"/api/News/market":{"get":{"tags":["News"],"summary":"Get market/finance news","parameters":[{"name":"symbol","in":"query","description":"Optional stock symbol to filter news","schema":{"type":"string"}},{"name":"language","in":"query","description":"Language code","schema":{"type":"string","default":"en"}},{"name":"country","in":"query","description":"Country code","schema":{"type":"string","default":"US"}},{"name":"maxResults","in":"query","description":"Maximum number of results (1-50)","schema":{"type":"integer","format":"int32","default":10}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NewsArticle"}}}}}}}},"/api/News/hn":{"get":{"tags":["News"],"summary":"Get Hacker News stories (front page, or keyword search when q is given)","parameters":[{"name":"q","in":"query","description":"Optional search keyword (e.g. bitcoin, trading)","schema":{"type":"string"}},{"name":"maxResults","in":"query","description":"Maximum number of results (1-50)","schema":{"type":"integer","format":"int32","default":10}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NewsArticle"}}}}}}}},"/api/{symbol}/ohlc":{"get":{"tags":["Ohlc"],"summary":"Get OHLCV candlestick bars for a symbol","parameters":[{"name":"symbol","in":"path","description":"Symbol name (e.g. EURUSD, XAUUSD, BTCUSD)","required":true,"schema":{"type":"string"}},{"name":"interval","in":"query","description":"Bar interval: 1m, 5m, 15m, 30m, 1h, 4h, 1d (default: 1h)","schema":{"type":"string","default":"1h"}},{"name":"limit","in":"query","description":"Number of bars to return, max 1000 (default: 100)","schema":{"type":"integer","format":"int32","default":100}},{"name":"from","in":"query","description":"Start time ISO 8601 (optional)","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","description":"End time ISO 8601 (optional)","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OhlcResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/s/{symbol}":{"get":{"tags":["SymbolRedirect"],"parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"301":{"description":"Moved Permanently"},"302":{"description":"Found"}}}},"/api/Symbols":{"get":{"tags":["Symbols"],"summary":"Get all symbols with optional filtering","parameters":[{"name":"source","in":"query","description":"Filter by data source (MT5, MATRIKS)","schema":{"type":"string"}},{"name":"type","in":"query","description":"Filter by symbol type (Forex, Stock, Crypto, etc.)","schema":{"enum":["Forex","Stock","Index","Commodity","Crypto","Future","Option","CFD"],"type":"string"}},{"name":"exchange","in":"query","description":"Filter by exchange name","schema":{"type":"string"}},{"name":"activeOnly","in":"query","description":"Only symbols the broker lists as active. Excludes almost nothing — see liveOnly.","schema":{"type":"boolean","default":false}},{"name":"liveOnly","in":"query","description":"Only symbols currently receiving ticks. This is the filter a symbol picker wants.","schema":{"type":"boolean","default":false}},{"name":"quotedWithinDays","in":"query","description":"Only symbols that quoted at least once in the last N days (1–30). Unlike\r\n`liveOnly`, this survives a market close: FX and equity instruments stay in\r\nthe list over the weekend instead of vanishing. Use it for anything whose output\r\nhas to be stable — a sitemap, a category listing, a navigation menu.","schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SymbolInfo"}}}}}}}},"/api/Symbols/search":{"get":{"tags":["Symbols"],"summary":"Search symbols by name or description","parameters":[{"name":"q","in":"query","description":"Search query","schema":{"type":"string"}},{"name":"liveOnly","in":"query","description":"Only return symbols currently receiving ticks.","schema":{"type":"boolean","default":false}},{"name":"limit","in":"query","description":"Maximum results. Default 25, capped at 200.","schema":{"type":"integer","format":"int32","default":25}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SymbolInfo"}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/Symbols/{name}":{"get":{"tags":["Symbols"],"summary":"Get a specific symbol by name","parameters":[{"name":"name","in":"path","description":"Symbol name (e.g., EURUSD, XAUUSD, BTCUSD)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SymbolInfo"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/{symbol}":{"get":{"tags":["Ticks"],"summary":"Get the latest tick for a specific symbol","parameters":[{"name":"symbol","in":"path","description":"Symbol name (e.g., EURUSD, XAUUSD, BTCUSD)","required":true,"schema":{"type":"string"}},{"name":"allowStale","in":"query","description":"Whether to return the last known quote once a market closes.\r\n\n\r\nDefaults to `true`: forex stops quoting from Friday night to Sunday\r\nnight and equities stop for most of every day, and 97% of weekend\r\nrequests to this endpoint used to be 404s. Every response says which it\r\nis — `marketState`, `stale` and `quoteAgeSeconds` are\r\nalways present, live or not.\r\n\n\r\nPass `allowStale=false` for the strict behaviour: 404 the moment a\r\nquote is more than five minutes old. That is the right setting for a\r\ntrading client, which should never be handed a stale price at all.\r\n","schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TickResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/latest":{"get":{"tags":["Ticks"],"summary":"Get latest ticks for multiple symbols","parameters":[{"name":"symbols","in":"query","description":"Array of symbol names","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowStale","in":"query","description":"Include last known quotes for closed markets. See M:TickAPI.WebAPI.Controllers.TicksController.GetLatest(System.String,System.Nullable{System.Boolean},System.Threading.CancellationToken).","schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/TickResponse"}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/{symbol}/history":{"get":{"tags":["Ticks"],"summary":"Get historical tick data for a symbol","parameters":[{"name":"symbol","in":"path","description":"Symbol name","required":true,"schema":{"type":"string"}},{"name":"count","in":"query","description":"Number of ticks to retrieve (max 1000)","schema":{"type":"integer","format":"int32","default":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Tick"}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/active":{"get":{"tags":["Ticks"],"summary":"Get list of symbols that have recent tick data with details","parameters":[{"name":"quotedWithinDays","in":"query","description":"Widen the window from \"quoting right now\" to \"quoted at least once in\r\nthe last N days\" (1-30). Without it this list empties out at every\r\nmarket close, which is correct for a liveness probe and wrong for\r\nanything a person navigates.","schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActiveSymbolInfo"}}}}}}}}},"components":{"schemas":{"ActiveSymbolInfo":{"required":["description","exchange","name","source","type"],"type":"object","properties":{"name":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"exchange":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}},"additionalProperties":false},"CalendarCountry":{"required":["code","name"],"type":"object","properties":{"code":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"currency":{"type":"string","nullable":true}},"additionalProperties":false},"CalendarEvent":{"required":["countryCode","eventId","id","importance","name","source","type"],"type":"object","properties":{"id":{"type":"string","nullable":true},"eventId":{"type":"string","nullable":true},"time":{"type":"string","format":"date-time"},"period":{"type":"string","format":"date-time","nullable":true},"countryCode":{"type":"string","nullable":true},"currency":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"importance":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"sector":{"type":"string","nullable":true},"unit":{"type":"string","nullable":true},"multiplier":{"type":"string","nullable":true},"digits":{"type":"integer","format":"int32"},"actual":{"type":"number","format":"double","nullable":true},"forecast":{"type":"number","format":"double","nullable":true},"previous":{"type":"number","format":"double","nullable":true},"revisedPrevious":{"type":"number","format":"double","nullable":true},"revision":{"type":"integer","format":"int32"},"timeMode":{"type":"string","nullable":true},"sourceUrl":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}},"additionalProperties":false},"GainerLoser":{"required":["symbol"],"type":"object","properties":{"symbol":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"exchange":{"type":"string","nullable":true},"type":{"enum":["Forex","Stock","Index","Commodity","Crypto","Future","Option","CFD"],"type":"string","nullable":true},"lastPrice":{"type":"number","format":"double"},"changePercent":{"type":"number","format":"double"},"volume":{"type":"integer","format":"int64"},"high":{"type":"number","format":"double"},"low":{"type":"number","format":"double"}},"additionalProperties":false},"GainerLoserResponse":{"required":["data","period"],"type":"object","properties":{"period":{"type":"string","nullable":true},"exchange":{"type":"string","nullable":true},"type":{"enum":["Forex","Stock","Index","Commodity","Crypto","Future","Option","CFD"],"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/GainerLoser"},"nullable":true},"marketState":{"type":"string","nullable":true},"asOf":{"type":"string","format":"date-time","nullable":true}},"additionalProperties":false},"HealthResponse":{"required":["redis","signalR","status"],"type":"object","properties":{"status":{"type":"string","nullable":true},"timestamp":{"type":"string","format":"date-time"},"redis":{"$ref":"#/components/schemas/RedisHealth"},"signalR":{"$ref":"#/components/schemas/SignalRHealth"}},"additionalProperties":false},"MarketOverview":{"type":"object","properties":{"totalSymbols":{"type":"integer","format":"int32"},"advancers":{"type":"integer","format":"int32"},"decliners":{"type":"integer","format":"int32"},"unchanged":{"type":"integer","format":"int32"},"totalVolume":{"type":"integer","format":"int64"},"totalTurnover":{"type":"number","format":"double"}},"additionalProperties":false},"MarketSummaryResponse":{"required":["overview"],"type":"object","properties":{"exchange":{"type":"string","nullable":true},"type":{"enum":["Forex","Stock","Index","Commodity","Crypto","Future","Option","CFD"],"type":"string","nullable":true},"timestamp":{"type":"string","format":"date-time"},"overview":{"$ref":"#/components/schemas/MarketOverview"},"marketState":{"type":"string","nullable":true},"asOf":{"type":"string","format":"date-time","nullable":true}},"additionalProperties":false},"MostActive":{"required":["symbol"],"type":"object","properties":{"symbol":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"exchange":{"type":"string","nullable":true},"type":{"enum":["Forex","Stock","Index","Commodity","Crypto","Future","Option","CFD"],"type":"string","nullable":true},"lastPrice":{"type":"number","format":"double"},"changePercent":{"type":"number","format":"double"},"volume":{"type":"integer","format":"int64"},"turnover":{"type":"number","format":"double"}},"additionalProperties":false},"MostActiveResponse":{"required":["data","metric"],"type":"object","properties":{"metric":{"type":"string","nullable":true},"exchange":{"type":"string","nullable":true},"type":{"enum":["Forex","Stock","Index","Commodity","Crypto","Future","Option","CFD"],"type":"string","nullable":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/MostActive"},"nullable":true},"marketState":{"type":"string","nullable":true},"asOf":{"type":"string","format":"date-time","nullable":true}},"additionalProperties":false},"NewsArticle":{"type":"object","properties":{"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"publisher":{"type":"string","nullable":true},"publishedDate":{"type":"string","format":"date-time"},"imageUrl":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"country":{"type":"string","nullable":true}},"additionalProperties":false},"OhlcBar":{"type":"object","properties":{"openTime":{"type":"string","format":"date-time"},"open":{"type":"number","format":"double"},"high":{"type":"number","format":"double"},"low":{"type":"number","format":"double"},"close":{"type":"number","format":"double"},"volume":{"type":"integer","format":"int64"},"tickVolume":{"type":"integer","format":"int64"},"isOpen":{"type":"boolean"}},"additionalProperties":false},"OhlcResponse":{"type":"object","properties":{"symbol":{"type":"string","nullable":true},"interval":{"type":"string","nullable":true},"bars":{"type":"array","items":{"$ref":"#/components/schemas/OhlcBar"},"nullable":true}},"additionalProperties":false},"ProblemDetails":{"type":"object","properties":{"type":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"status":{"type":"integer","format":"int32","nullable":true},"detail":{"type":"string","nullable":true},"instance":{"type":"string","nullable":true}},"additionalProperties":{}},"RedisHealth":{"required":["endpoints"],"type":"object","properties":{"connected":{"type":"boolean"},"endpoints":{"type":"array","items":{"type":"string"},"nullable":true}},"additionalProperties":false},"SignalRHealth":{"required":["topSymbolSubscriptions"],"type":"object","properties":{"connectionCount":{"type":"integer","format":"int32"},"topSymbolSubscriptions":{"type":"object","additionalProperties":{"type":"integer","format":"int32"},"nullable":true}},"additionalProperties":false},"SymbolInfo":{"required":["currency","description","exchange","name","source","type"],"type":"object","properties":{"name":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"exchange":{"type":"string","nullable":true},"type":{"type":"string","nullable":true},"digits":{"type":"integer","format":"int32"},"tickSize":{"type":"number","format":"double"},"tickValue":{"type":"number","format":"double"},"contractSize":{"type":"number","format":"double"},"currency":{"type":"string","nullable":true},"source":{"type":"string","nullable":true},"isActive":{"type":"boolean","description":"Broker lists this instrument. Nearly always true."},"hasData":{"type":"boolean","description":"Ticks are flowing for it right now. This is the one to filter on."}},"additionalProperties":false,"description":"Symbol metadata plus whether it is currently receiving ticks."},"Tick":{"required":["source","symbol"],"type":"object","properties":{"symbol":{"type":"string","nullable":true},"bid":{"type":"number","format":"double"},"ask":{"type":"number","format":"double"},"last":{"type":"number","format":"double"},"volume":{"type":"integer","format":"int64"},"timestamp":{"type":"string","format":"date-time"},"source":{"type":"string","nullable":true},"high":{"type":"number","format":"double"},"low":{"type":"number","format":"double"},"direction":{"type":"string","nullable":true},"dayDiffPercent":{"type":"number","format":"double"},"description":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"exchange":{"type":"string","nullable":true},"spread":{"type":"number","format":"double","readOnly":true},"mid":{"type":"number","format":"double","readOnly":true}},"additionalProperties":false},"TickResponse":{"required":["marketState","source","symbol"],"type":"object","properties":{"symbol":{"type":"string","nullable":true},"bid":{"type":"number","format":"double"},"ask":{"type":"number","format":"double"},"last":{"type":"number","format":"double"},"volume":{"type":"integer","format":"int64"},"timestamp":{"type":"string","format":"date-time"},"source":{"type":"string","nullable":true},"exchange":{"type":"string","nullable":true},"high":{"type":"number","format":"double"},"low":{"type":"number","format":"double"},"direction":{"type":"string","nullable":true},"dayDiffPercent":{"type":"number","format":"double"},"description":{"type":"string","nullable":true},"time":{"type":"string","nullable":true},"spread":{"type":"number","format":"double"},"mid":{"type":"number","format":"double"},"stale":{"type":"boolean"},"quoteAgeSeconds":{"type":"integer","format":"int64"},"marketState":{"type":"string","nullable":true},"lastQuoteAt":{"type":"string","format":"date-time"}},"additionalProperties":false}}}}