{"asyncapi":"3.0.0","id":"https://aperiodic.io/api.data.asyncapi.json","info":{"title":"Aperiodic Live Feed","version":"1.6.1","description":"Every metric your plan covers, streamed as each bar closes, on the same API key as the REST API.\n\nOpen a WebSocket to wss://stream.aperiodic.io/v1/stream with your key in the X-API-KEY header (never in the URL). Subscribe to channels named dataset.exchange.interval with the catalog's names, for example ohlcv.binance-futures.1m.\n\nDelivery is at most once: rows sent while you are disconnected are not sent again unless you subscribe with since, which replays the recent bars a channel still holds before its live rows. Subscriptions belong to the connection, so subscribe again after every reconnect.\n\nFrames are JSON text, at most 64 KB and 200 channels each from the client, 10 control frames a second in bursts of 20. A connection with nothing to receive for 25 seconds gets a heartbeat.\n\nThe server closes a connection with these codes:\n- 4001: the plan lapsed, the key was rotated, or the entitlement could not be confirmed for 15 minutes past its expiry. An error frame with code auth_expired comes first.\n- 1008: control frames stayed over the rate limit for 10 seconds straight.\n- 1011: the server lost the connection's state. Reconnect and subscribe again.\n\nOperations are written from the client's side. The guide, with plan limits and examples: https://aperiodic.io/api-docs/live","externalDocs":{"description":"Live feed guide","url":"https://aperiodic.io/api-docs/live"}},"defaultContentType":"application/json","servers":{"production":{"host":"stream.aperiodic.io","protocol":"wss","description":"The key is checked before the upgrade: a refused handshake gets an HTTP status (401, 403, 426, 429 or 503) with a JSON error instead of a socket.","security":[{"$ref":"#/components/securitySchemes/apiKey"}]}},"channels":{"stream":{"address":"/v1/stream","title":"Live feed","description":"One connection carries every channel you subscribe to; data, snapshot and replay frames name their channel.","messages":{"subscribe":{"$ref":"#/components/messages/subscribe"},"unsubscribe":{"$ref":"#/components/messages/unsubscribe"},"ping":{"$ref":"#/components/messages/ping"},"subscribed":{"$ref":"#/components/messages/subscribed"},"unsubscribed":{"$ref":"#/components/messages/unsubscribed"},"pong":{"$ref":"#/components/messages/pong"},"heartbeat":{"$ref":"#/components/messages/heartbeat"},"error":{"$ref":"#/components/messages/error"},"data":{"$ref":"#/components/messages/data"},"snapshot":{"$ref":"#/components/messages/snapshot"},"replay":{"$ref":"#/components/messages/replay"},"replayed":{"$ref":"#/components/messages/replayed"}},"bindings":{"ws":{"method":"GET","headers":{"type":"object","required":["X-API-KEY"],"properties":{"X-API-KEY":{"type":"string","description":"Your API key. Never sent in the URL, so browsers cannot connect directly."}}},"bindingVersion":"0.1.0"}}}},"operations":{"sendSubscribe":{"action":"send","channel":{"$ref":"#/channels/stream"},"summary":"Add channels, or symbols to a channel you have. Add since to replay recent bars first.","messages":[{"$ref":"#/channels/stream/messages/subscribe"}],"reply":{"channel":{"$ref":"#/channels/stream"},"messages":[{"$ref":"#/channels/stream/messages/subscribed"},{"$ref":"#/channels/stream/messages/error"}]}},"sendUnsubscribe":{"action":"send","channel":{"$ref":"#/channels/stream"},"summary":"Drop a channel, or some of its symbols when it was subscribed with a symbol list.","messages":[{"$ref":"#/channels/stream/messages/unsubscribe"}],"reply":{"channel":{"$ref":"#/channels/stream"},"messages":[{"$ref":"#/channels/stream/messages/unsubscribed"},{"$ref":"#/channels/stream/messages/error"}]}},"sendPing":{"action":"send","channel":{"$ref":"#/channels/stream"},"summary":"Optional: the server already sends heartbeats when idle.","messages":[{"$ref":"#/channels/stream/messages/ping"}],"reply":{"channel":{"$ref":"#/channels/stream"},"messages":[{"$ref":"#/channels/stream/messages/pong"}]}},"receiveSubscribed":{"action":"receive","channel":{"$ref":"#/channels/stream"},"summary":"The answer to a subscribe: what was granted and why anything was refused.","messages":[{"$ref":"#/channels/stream/messages/subscribed"}]},"receiveUnsubscribed":{"action":"receive","channel":{"$ref":"#/channels/stream"},"summary":"The answer to an unsubscribe; also sent without an id when a plan change removes channels.","messages":[{"$ref":"#/channels/stream/messages/unsubscribed"}]},"receivePong":{"action":"receive","channel":{"$ref":"#/channels/stream"},"summary":"The answer to a ping, echoing its id if it had one.","messages":[{"$ref":"#/channels/stream/messages/pong"}]},"receiveHeartbeat":{"action":"receive","channel":{"$ref":"#/channels/stream"},"summary":"Sent when a connection has received nothing for 25 seconds.","messages":[{"$ref":"#/channels/stream/messages/heartbeat"}]},"receiveError":{"action":"receive","channel":{"$ref":"#/channels/stream"},"summary":"A frame that could not be applied. The connection stays open.","messages":[{"$ref":"#/channels/stream/messages/error"}]},"receiveData":{"action":"receive","channel":{"$ref":"#/channels/stream"},"summary":"One row, as each bar closes.","messages":[{"$ref":"#/channels/stream/messages/data"}]},"receiveSnapshot":{"action":"receive","channel":{"$ref":"#/channels/stream"},"summary":"Right after a subscribe, on plans with snapshots: the latest row per symbol. Best-effort.","messages":[{"$ref":"#/channels/stream/messages/snapshot"}]},"receiveReplay":{"action":"receive","channel":{"$ref":"#/channels/stream"},"summary":"After a subscribe with since: one bar of history, oldest first, its rows as produced.","messages":[{"$ref":"#/channels/stream/messages/replay"}]},"receiveReplayed":{"action":"receive","channel":{"$ref":"#/channels/stream"},"summary":"The end of a channel's replay: the bars it covered and the ones the feed does not hold. Live rows follow.","messages":[{"$ref":"#/channels/stream/messages/replayed"}]}},"components":{"securitySchemes":{"apiKey":{"type":"httpApiKey","name":"X-API-KEY","in":"header","description":"The same API key as the REST API."}},"messages":{"subscribe":{"name":"subscribe","title":"Subscribe","summary":"Add channels, or symbols to a channel you have. Add since to replay recent bars first.","contentType":"application/json","payload":{"$ref":"#/components/schemas/SubscribeFrame"},"examples":[{"name":"subscribe-example","payload":{"op":"subscribe","id":"c1","channels":[{"dataset":"ohlcv","exchange":"binance-futures","interval":"1m","symbols":["perpetual-BTC-USDT:USDT"]}]}}]},"unsubscribe":{"name":"unsubscribe","title":"Unsubscribe","summary":"Drop a channel, or some of its symbols when it was subscribed with a symbol list.","contentType":"application/json","payload":{"$ref":"#/components/schemas/UnsubscribeFrame"},"examples":[{"name":"unsubscribe-example","payload":{"op":"unsubscribe","id":"u1","channels":["ohlcv.binance-futures.1m"]}}]},"ping":{"name":"ping","title":"Ping","summary":"Optional: the server already sends heartbeats when idle.","contentType":"application/json","payload":{"$ref":"#/components/schemas/PingFrame"},"examples":[{"name":"ping-example","payload":{"op":"ping","id":"p1"}}]},"subscribed":{"name":"subscribed","title":"Subscribed","summary":"The answer to a subscribe: what was granted and why anything was refused.","contentType":"application/json","payload":{"$ref":"#/components/schemas/SubscribedFrame"},"examples":[{"name":"subscribed-example","payload":{"op":"subscribed","id":"c1","channels":["ohlcv.binance-futures.1m"],"rejected":[]}}]},"unsubscribed":{"name":"unsubscribed","title":"Unsubscribed","summary":"The answer to an unsubscribe; also sent without an id when a plan change removes channels.","contentType":"application/json","payload":{"$ref":"#/components/schemas/UnsubscribedFrame"},"examples":[{"name":"unsubscribed-example","payload":{"op":"unsubscribed","id":"u1","channels":["ohlcv.binance-futures.1m"],"rejected":[]}}]},"pong":{"name":"pong","title":"Pong","summary":"The answer to a ping, echoing its id if it had one.","contentType":"application/json","payload":{"$ref":"#/components/schemas/PongFrame"},"examples":[{"name":"pong-example","payload":{"op":"pong","id":"p1"}}]},"heartbeat":{"name":"heartbeat","title":"Heartbeat","summary":"Sent when a connection has received nothing for 25 seconds.","contentType":"application/json","payload":{"$ref":"#/components/schemas/HeartbeatFrame"},"examples":[{"name":"heartbeat-example","payload":{"op":"heartbeat","time":1793700000000}}]},"error":{"name":"error","title":"Error","summary":"A frame that could not be applied. The connection stays open.","contentType":"application/json","payload":{"$ref":"#/components/schemas/ErrorFrame"},"examples":[{"name":"error-example","payload":{"op":"error","code":"limit_exceeded","message":"At most 10 control frames per second"}}]},"data":{"name":"data","title":"Data","summary":"One row, as each bar closes.","contentType":"application/json","payload":{"$ref":"#/components/schemas/DataFrame"},"examples":[{"name":"data-example","payload":{"channel":"ohlcv.binance-futures.1m","data":{"symbol":"perpetual-BTC-USDT:USDT"}}}]},"snapshot":{"name":"snapshot","title":"Snapshot","summary":"Right after a subscribe, on plans with snapshots: the latest row per symbol. Best-effort.","contentType":"application/json","payload":{"$ref":"#/components/schemas/SnapshotFrame"},"examples":[{"name":"snapshot-example","payload":{"channel":"ohlcv.binance-futures.1m","snapshot":true,"data":{"symbol":"perpetual-BTC-USDT:USDT"}}}]},"replay":{"name":"replay","title":"Replay","summary":"After a subscribe with since: one bar of history, oldest first, its rows as produced.","contentType":"application/json","payload":{"$ref":"#/components/schemas/ReplayFrame"},"examples":[{"name":"replay-example","payload":{"channel":"ohlcv.binance-futures.1m","replay":true,"time":1793700000000,"data":[{"symbol":"perpetual-BTC-USDT:USDT"}]}}]},"replayed":{"name":"replayed","title":"Replayed","summary":"The end of a channel's replay: the bars it covered and the ones the feed does not hold. Live rows follow.","contentType":"application/json","payload":{"$ref":"#/components/schemas/ReplayedFrame"},"examples":[{"name":"replayed-example","payload":{"op":"replayed","id":"c1","channel":"ohlcv.binance-futures.1m","from":1793700000000,"to":1793703540000,"bars":59,"rows":59,"missing":[1793701200000],"truncated":false}}]}},"schemas":{"MessageId":{"type":"string","pattern":"^[A-Za-z0-9_\\-.:]{1,64}$","description":"Echoed back in the answer to this frame."},"Dataset":{"type":"string","enum":["flow","trade_size","range","impact","updownticks","run_structure","returns","slippage","basis","funding","open_interest","derivative_price","ohlcv","vtwap","l1_price","l1_imbalance","l1_liquidity","l2_imbalance","l2_liquidity"],"description":"A dataset id, as the catalog and the REST API name it."},"Exchange":{"type":"string","enum":["binance-futures","okx-perps","hyperliquid-perps"]},"Interval":{"type":"string","enum":["15s","30s","1m","5m","15m","30m","1h","4h","1d"],"description":"Rows arrive as each bar closes. 15s and 30s are Institutional only."},"ChannelName":{"type":"string","pattern":"^[a-z0-9]+(?:_[a-z0-9]+)*\\.[a-z0-9]+(?:-[a-z0-9]+)*\\.[1-9][0-9]*[smhd]$","description":"dataset.exchange.interval, every symbol the plan allows.","examples":["ohlcv.binance-futures.1m"]},"Symbols":{"type":"array","minItems":1,"maxItems":1000,"uniqueItems":true,"items":{"type":"string","pattern":"^[A-Za-z0-9][A-Za-z0-9:_\\-/.]{0,63}$"},"description":"Atlas symbol ids, as in the REST API. Leave out for every symbol, where your plan allows it."},"SubscribeChannel":{"type":"object","required":["dataset","exchange","interval"],"additionalProperties":false,"properties":{"dataset":{"$ref":"#/components/schemas/Dataset"},"exchange":{"$ref":"#/components/schemas/Exchange"},"interval":{"$ref":"#/components/schemas/Interval"},"symbols":{"$ref":"#/components/schemas/Symbols"},"since":{"type":"integer","minimum":0,"description":"A bar time in epoch milliseconds. The channel replays its bars from then on, oldest first, before its live rows. 1m and longer intervals only."}}},"UnsubscribeChannel":{"type":"object","required":["dataset","exchange","interval"],"additionalProperties":false,"properties":{"dataset":{"$ref":"#/components/schemas/Dataset"},"exchange":{"$ref":"#/components/schemas/Exchange"},"interval":{"$ref":"#/components/schemas/Interval"},"symbols":{"$ref":"#/components/schemas/Symbols"}}},"SubscribeFrame":{"type":"object","required":["op","channels"],"properties":{"op":{"const":"subscribe"},"id":{"$ref":"#/components/schemas/MessageId"},"channels":{"type":"array","minItems":1,"maxItems":200,"items":{"oneOf":[{"$ref":"#/components/schemas/ChannelName"},{"$ref":"#/components/schemas/SubscribeChannel"}]}}}},"UnsubscribeFrame":{"type":"object","required":["op","channels"],"properties":{"op":{"const":"unsubscribe"},"id":{"$ref":"#/components/schemas/MessageId"},"channels":{"type":"array","minItems":1,"maxItems":200,"items":{"oneOf":[{"$ref":"#/components/schemas/ChannelName"},{"$ref":"#/components/schemas/UnsubscribeChannel"}]}}}},"PingFrame":{"type":"object","required":["op"],"properties":{"op":{"const":"ping"},"id":{"$ref":"#/components/schemas/MessageId"}}},"RejectionCode":{"type":"string","enum":["not_entitled","not_live","unknown_channel","limit_exceeded","invalid_message"],"description":"not_entitled: The dataset or interval is not in your plan.\nnot_live: Your plan has the dataset, but it is not streamed at that interval. The message names the intervals it is streamed at.\nunknown_channel: The channel is malformed, or the exchange does not carry that dataset.\nlimit_exceeded: A plan or connection limit would be passed. The message says which.\ninvalid_message: The frame could not be applied: not JSON, a missing field, or unsubscribing from something you are not subscribed to."},"RejectedChannel":{"type":"object","required":["channel","code","message"],"properties":{"channel":{"type":"string"},"code":{"$ref":"#/components/schemas/RejectionCode"},"message":{"type":"string"}}},"SubscribedFrame":{"type":"object","required":["op","channels","rejected"],"properties":{"op":{"const":"subscribed"},"id":{"$ref":"#/components/schemas/MessageId"},"channels":{"type":"array","items":{"type":"string"}},"rejected":{"type":"array","items":{"$ref":"#/components/schemas/RejectedChannel"}}}},"UnsubscribedFrame":{"type":"object","required":["op","channels","rejected"],"properties":{"op":{"const":"unsubscribed"},"id":{"$ref":"#/components/schemas/MessageId"},"channels":{"type":"array","items":{"type":"string"}},"rejected":{"type":"array","items":{"$ref":"#/components/schemas/RejectedChannel"}}}},"PongFrame":{"type":"object","required":["op"],"properties":{"op":{"const":"pong"},"id":{"$ref":"#/components/schemas/MessageId"}}},"HeartbeatFrame":{"type":"object","required":["op","time"],"properties":{"op":{"const":"heartbeat"},"time":{"type":"integer","description":"Epoch milliseconds."}}},"ErrorFrame":{"type":"object","required":["op","code","message"],"properties":{"op":{"const":"error"},"id":{"$ref":"#/components/schemas/MessageId"},"code":{"oneOf":[{"$ref":"#/components/schemas/RejectionCode"},{"const":"auth_expired"}],"description":"auth_expired comes just before close code 4001."},"message":{"type":"string"}}},"Row":{"anyOf":[{"$ref":"#/components/schemas/FlowRow"},{"$ref":"#/components/schemas/TradeSizeRow"},{"$ref":"#/components/schemas/RangeRow"},{"$ref":"#/components/schemas/ImpactRow"},{"$ref":"#/components/schemas/UpdownticksRow"},{"$ref":"#/components/schemas/RunStructureRow"},{"$ref":"#/components/schemas/ReturnsRow"},{"$ref":"#/components/schemas/SlippageRow"},{"$ref":"#/components/schemas/BasisRow"},{"$ref":"#/components/schemas/FundingRow"},{"$ref":"#/components/schemas/OpenInterestRow"},{"$ref":"#/components/schemas/DerivativePriceRow"},{"$ref":"#/components/schemas/OhlcvRow"},{"$ref":"#/components/schemas/VtwapRow"},{"$ref":"#/components/schemas/L1PriceRow"},{"$ref":"#/components/schemas/L1ImbalanceRow"},{"$ref":"#/components/schemas/L1LiquidityRow"},{"$ref":"#/components/schemas/L2ImbalanceRow"},{"$ref":"#/components/schemas/L2LiquidityRow"}],"description":"The channel's dataset decides which row it is; its fields are the dataset's columns."},"DataFrame":{"type":"object","required":["channel","data"],"properties":{"channel":{"type":"string"},"data":{"$ref":"#/components/schemas/Row"}}},"SnapshotFrame":{"type":"object","required":["channel","snapshot","data"],"properties":{"channel":{"type":"string"},"snapshot":{"const":true},"data":{"$ref":"#/components/schemas/Row"}}},"ReplayFrame":{"type":"object","required":["channel","replay","time","data"],"properties":{"channel":{"type":"string"},"replay":{"const":true},"time":{"type":"integer","description":"The bar's open time, in epoch milliseconds."},"data":{"type":"array","items":{"$ref":"#/components/schemas/Row"}}}},"ReplayedFrame":{"oneOf":[{"type":"object","required":["op","channel","from","to","bars","rows","missing","truncated"],"properties":{"op":{"const":"replayed"},"id":{"$ref":"#/components/schemas/MessageId"},"channel":{"type":"string"},"from":{"type":"integer","description":"The first bar time covered: the later of since and what is kept."},"to":{"type":["integer","null"],"description":"The newest bar sent, or null when none was."},"bars":{"type":"integer","minimum":0},"rows":{"type":"integer","minimum":0},"missing":{"type":"array","items":{"type":"integer"},"description":"Bar times in the replay the feed does not hold, once each is 60 seconds past its close. Fill them from REST."},"truncated":{"type":"boolean","description":"True when the replay stopped at 20000 rows or 8 MB across the subscribe's channels."}}},{"type":"object","required":["op","channel","unavailable"],"properties":{"op":{"const":"replayed"},"id":{"$ref":"#/components/schemas/MessageId"},"channel":{"type":"string"},"unavailable":{"const":true,"description":"The history could not be read. Live rows still follow."}}}]},"FlowRow":{"type":"object","title":"Flow Metrics row","description":"Directional order flow split by taker buy vs. sell, broken into small/medium/large notional segments, with a flow toxicity score. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"taker_buy_volume":{"type":"number","description":"Taker Buy Volume. Total buy-side traded notional in the interval"},"taker_sell_volume":{"type":"number","description":"Taker Sell Volume. Total sell-side traded notional in the interval"},"taker_buy_count":{"type":"number","description":"Taker Buy Count. Number of buy-side trades in the interval"},"taker_sell_count":{"type":"number","description":"Taker Sell Count. Number of sell-side trades in the interval"},"volume_delta":{"type":"number","description":"Volume Delta. Buy-side traded quantity minus sell-side traded quantity"},"volume_delta_notional":{"type":"number","description":"Volume Delta Notional. Buy-side traded notional minus sell-side traded notional"},"flow_entropy":{"type":"number","description":"Flow Entropy. Entropy of the buy-versus-sell notional split in the interval"},"flow_toxicity_score":{"type":"number","description":"Flow Toxicity Score. Past-normalized signed notional flow multiplied by past-normalized short-horizon realized volatility"},"taker_buy_sell_ratio":{"type":"number","description":"Buy/Sell Ratio. Buy-side traded notional divided by sell-side traded notional"},"taker_buy_sell_count_ratio":{"type":"number","description":"Buy/Sell Count Ratio. Buy-side trade count divided by sell-side trade count"},"taker_buy_sell_percentage":{"type":"number","description":"Taker Buy %. Share of traded notional that came from buy-side trades"},"taker_buy_sell_count_percentage":{"type":"number","description":"Taker Buy Count %. Share of trades that were buy-side trades"},"taker_buy_small_order_volume":{"type":"number","description":"Buy Small Order Volume. Total buy-side notional from small trades under $100"},"taker_buy_small_order_count":{"type":"number","description":"Buy Small Order Count. Number of buy-side trades under $100"},"taker_buy_medium_order_volume":{"type":"number","description":"Buy Medium Order Volume. Total buy-side notional from medium trades from $100 to under $1,000"},"taker_buy_medium_order_count":{"type":"number","description":"Buy Medium Order Count. Number of buy-side trades from $100 to under $1,000"},"taker_buy_large_order_volume":{"type":"number","description":"Buy Large Order Volume. Total buy-side notional from large trades of at least $1,000"},"taker_buy_large_order_count":{"type":"number","description":"Buy Large Order Count. Number of buy-side trades of at least $1,000"},"taker_sell_small_order_volume":{"type":"number","description":"Sell Small Order Volume. Total sell-side notional from small trades under $100"},"taker_sell_small_order_count":{"type":"number","description":"Sell Small Order Count. Number of sell-side trades under $100"},"taker_sell_medium_order_volume":{"type":"number","description":"Sell Medium Order Volume. Total sell-side notional from medium trades from $100 to under $1,000"},"taker_sell_medium_order_count":{"type":"number","description":"Sell Medium Order Count. Number of sell-side trades from $100 to under $1,000"},"taker_sell_large_order_volume":{"type":"number","description":"Sell Large Order Volume. Total sell-side notional from large trades of at least $1,000"},"taker_sell_large_order_count":{"type":"number","description":"Sell Large Order Count. Number of sell-side trades of at least $1,000"},"taker_buy_small_order_percentage":{"type":"number","description":"Buy Small Order %. Ratio of small buy-side trade notional to total buy-side traded notional"},"taker_buy_medium_order_percentage":{"type":"number","description":"Buy Medium Order %. Ratio of medium buy-side trade notional to total buy-side traded notional"},"taker_buy_large_order_percentage":{"type":"number","description":"Buy Large Order %. Ratio of large buy-side trade notional to total buy-side traded notional"},"taker_buy_small_order_count_percentage":{"type":"number","description":"Buy Small Count %. Share of buy-side trades that were small trades"},"taker_buy_medium_order_count_percentage":{"type":"number","description":"Buy Medium Count %. Share of buy-side trades that were medium trades"},"taker_buy_large_order_count_percentage":{"type":"number","description":"Buy Large Count %. Share of buy-side trades that were large trades"},"taker_sell_small_order_percentage":{"type":"number","description":"Sell Small Order %. Ratio of small sell-side trade notional to total sell-side traded notional"},"taker_sell_medium_order_percentage":{"type":"number","description":"Sell Medium Order %. Ratio of medium sell-side trade notional to total sell-side traded notional"},"taker_sell_large_order_percentage":{"type":"number","description":"Sell Large Order %. Ratio of large sell-side trade notional to total sell-side traded notional"},"taker_sell_small_order_count_percentage":{"type":"number","description":"Sell Small Count %. Share of sell-side trades that were small trades"},"taker_sell_medium_order_count_percentage":{"type":"number","description":"Sell Medium Count %. Share of sell-side trades that were medium trades"},"taker_sell_large_order_count_percentage":{"type":"number","description":"Sell Large Count %. Share of sell-side trades that were large trades"}}},"TradeSizeRow":{"type":"object","title":"Trade Size row","description":"Trade notional split into small (< $100), medium ($100–$1,000), and large (≥ $1,000) segments, with summary statistics for individual trade sizes. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"small_order_volume":{"type":"number","description":"Small Order Volume. Total traded notional from small trades under $100"},"small_order_count":{"type":"number","description":"Small Order Count. Number of trades under $100"},"medium_order_volume":{"type":"number","description":"Medium Order Volume. Total traded notional from medium trades from $100 to under $1,000"},"medium_order_count":{"type":"number","description":"Medium Order Count. Number of trades from $100 to under $1,000"},"large_order_volume":{"type":"number","description":"Large Order Volume. Total traded notional from large trades of at least $1,000"},"large_order_count":{"type":"number","description":"Large Order Count. Number of trades of at least $1,000"},"volume":{"type":"number","description":"Total Volume. Total traded notional in the interval"},"n_trades":{"type":"number","description":"Trade Count. Number of trades in the interval"},"small_order_percentage":{"type":"number","description":"Small Order %. Ratio of small-trade notional to total traded notional"},"medium_order_percentage":{"type":"number","description":"Medium Order %. Ratio of medium-trade notional to total traded notional"},"large_order_percentage":{"type":"number","description":"Large Order %. Ratio of large-trade notional to total traded notional"},"small_order_count_percentage":{"type":"number","description":"Small Order Count %. Share of trades that were small trades"},"medium_order_count_percentage":{"type":"number","description":"Medium Order Count %. Share of trades that were medium trades"},"large_order_count_percentage":{"type":"number","description":"Large Order Count %. Share of trades that were large trades"},"trade_amount_mean":{"type":"number","description":"Mean Trade Size. Average trade notional"},"trade_amount_median":{"type":"number","description":"Median Trade Size. Median trade notional"},"trade_amount_std":{"type":"number","description":"Trade Size Std Dev. Standard deviation of trade notional"},"trade_amount_variance":{"type":"number","description":"Trade Size Variance. Variance of trade notional"},"trade_amount_skewness":{"type":"number","description":"Trade Size Skewness. Skewness of the trade-notional distribution"},"trade_amount_kurtosis":{"type":"number","description":"Trade Size Kurtosis. Kurtosis of the trade-notional distribution"},"trade_amount_min":{"type":"number","description":"Min Trade Size. Smallest trade notional in the interval"},"trade_amount_max":{"type":"number","description":"Max Trade Size. Largest trade notional in the interval"},"trade_amount_range_ratio":{"type":"number","description":"Trade Size Range Ratio. Largest trade notional divided by smallest trade notional"},"trade_amount_cv":{"type":"number","description":"Trade Size CV. Coefficient of variation of trade notional"}}},"RangeRow":{"type":"object","title":"Price Range & Distribution row","description":"Intrabar high-low price range and full distribution statistics (mean, median, std, skewness, kurtosis) for trade prices within each interval. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"range":{"type":"number","description":"Price Range. Highest trade price minus lowest trade price"},"range_bps":{"type":"number","description":"Range (bps). High-low trade price range in basis points of the closing price"},"price_mean":{"type":"number","description":"Mean Price. Average trade price in the interval"},"price_median":{"type":"number","description":"Median Price. Median trade price in the interval"},"price_std":{"type":"number","description":"Price Std Dev. Standard deviation of trade prices in the interval"},"price_variance":{"type":"number","description":"Price Variance. Variance of trade prices in the interval"},"price_skewness":{"type":"number","description":"Price Skewness. Skewness of the trade-price distribution"},"price_kurtosis":{"type":"number","description":"Price Kurtosis. Kurtosis of the trade-price distribution"},"price_range_ratio":{"type":"number","description":"Price Range Ratio. Highest trade price divided by lowest trade price"},"price_cv":{"type":"number","description":"Price CV. Coefficient of variation of trade price"}}},"ImpactRow":{"type":"object","title":"Impact Metrics row","description":"How much each unit of trading volume moves the price, measured via Amihud illiquidity, Kyle lambda, impact per notional, and large-trade reversal. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"amihud_like":{"type":"number","description":"Amihud Illiquidity. Absolute interval return divided by total traded notional"},"kyle_like_lambda":{"type":"number","description":"Kyle Lambda. Covariance of trade returns and signed trade size divided by signed-size variance"},"impact_per_notional":{"type":"number","description":"Impact per Notional. Absolute interval return divided by absolute signed notional flow"},"large_trade_reversal":{"type":"number","description":"Large Trade Reversal. Average five-trade-ahead return after trades in the top 10% by notional"},"directional_impact_asymmetry":{"type":"number","description":"Directional Impact Asymmetry. Average buy-trade price impact minus average sell-trade price impact"}}},"UpdownticksRow":{"type":"object","title":"Up / Down Tick Metrics row","description":"Uptick and downtick count, volume, ratios and percentages based on price movement direction. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"uptick_count":{"type":"number","description":"Uptick Count. Number of trades priced above the previous trade"},"downtick_count":{"type":"number","description":"Downtick Count. Number of trades priced below the previous trade"},"unchanged_count":{"type":"number","description":"Unchanged Count. Number of trades priced the same as the previous trade"},"uptick_volume":{"type":"number","description":"Uptick Volume. Total traded quantity on upticks"},"downtick_volume":{"type":"number","description":"Downtick Volume. Total traded quantity on downticks"},"unchanged_volume":{"type":"number","description":"Unchanged Volume. Total traded quantity on unchanged ticks"},"uptick_downtick_volume_ratio":{"type":"number","description":"Uptick/Downtick Volume Ratio. Uptick traded quantity divided by downtick traded quantity"},"uptick_downtick_count_ratio":{"type":"number","description":"Uptick/Downtick Count Ratio. Uptick trade count divided by downtick trade count"},"uptick_count_percentage":{"type":"number","description":"Uptick Count %. Share of trades that were upticks"},"downtick_count_percentage":{"type":"number","description":"Downtick Count %. Share of trades that were downticks"},"unchanged_count_percentage":{"type":"number","description":"Unchanged Count %. Share of trades that were unchanged ticks"},"uptick_volume_percentage":{"type":"number","description":"Uptick Volume %. Share of traded quantity that occurred on upticks"},"downtick_volume_percentage":{"type":"number","description":"Downtick Volume %. Share of traded quantity that occurred on downticks"},"unchanged_volume_percentage":{"type":"number","description":"Unchanged Volume %. Share of traded quantity that occurred on unchanged ticks"}}},"RunStructureRow":{"type":"object","title":"Trade Run Structure row","description":"Consecutive same-direction trade run lengths, imbalance, flip rate, and price change on direction flip. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"buy_run_max_len":{"type":"number","description":"Max Buy Run Length. Longest consecutive run of buy-side trades"},"sell_run_max_len":{"type":"number","description":"Max Sell Run Length. Longest consecutive run of sell-side trades"},"buy_run_mean_len":{"type":"number","description":"Mean Buy Run Length. Average length of consecutive buy-side runs"},"sell_run_mean_len":{"type":"number","description":"Mean Sell Run Length. Average length of consecutive sell-side runs"},"run_imbalance":{"type":"number","description":"Run Imbalance. Normalized difference between the longest buy run and longest sell run"},"flip_rate":{"type":"number","description":"Flip Rate. Share of trades whose side flipped versus the previous trade"},"price_change_on_flip":{"type":"number","description":"Price Change on Flip. Average absolute price change when trade direction flips"}}},"ReturnsRow":{"type":"object","title":"Returns & Volatility row","description":"Log-return based metrics: variance, realized volatility, bipower variation, jump ratio, autocorrelation, and trendiness. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"logret_var":{"type":"number","description":"Log-Return Variance. Variance of log returns within the interval"},"realized_vol":{"type":"number","description":"Realized Volatility. Square root of the sum of squared log returns in the interval"},"bipower_variation":{"type":"number","description":"Bipower Variation. Jump-robust volatility estimate built from adjacent absolute log returns"},"jump_ratio":{"type":"number","description":"Jump Ratio. Share of realized variance not explained by bipower variation"},"ret_autocorr_lag1":{"type":"number","description":"Return Autocorr (Lag 1). Lag-one autocorrelation of log returns within the interval"},"trendiness":{"type":"number","description":"Trendiness. Absolute net log return divided by total absolute log return"}}},"SlippageRow":{"type":"object","title":"Slippage row","description":"How much each trade pays above the best ask (buys) or receives below the best bid (sells) relative to the prevailing quote, aggregated per interval. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"slippage_mean":{"type":"number","description":"Mean Slippage. Average slippage in price units versus the prevailing quote"},"slippage_bps_mean":{"type":"number","description":"Mean Slippage (bps). Average slippage in basis points versus the prevailing quote"},"slippage_bps_std":{"type":"number","description":"Slippage Std Dev (bps). Standard deviation of slippage in basis points"},"slippage_bps_median":{"type":"number","description":"Median Slippage (bps). Median slippage in basis points"},"slippage_bps_p95":{"type":"number","description":"Slippage P95 (bps). 95th percentile slippage in basis points"},"slippage_bps_vwap":{"type":"number","description":"VWAP Slippage (bps). Trade-size-weighted average slippage in basis points"},"slippage_bps_buy_mean":{"type":"number","description":"Buy Slippage Mean (bps). Average slippage in basis points for buy-side trades"},"slippage_bps_sell_mean":{"type":"number","description":"Sell Slippage Mean (bps). Average slippage in basis points for sell-side trades"},"slippage_bps_buy_sell_ratio":{"type":"number","description":"Buy/Sell Slippage Ratio. Buy-side average slippage divided by sell-side average slippage"},"slippage_bps_sell_buy_ratio":{"type":"number","description":"Sell/Buy Slippage Ratio. Sell-side average slippage divided by buy-side average slippage"}}},"BasisRow":{"type":"object","title":"Basis row","description":"Perpetual futures mark price premium over index price (basis) and last trade price, in absolute and basis-point terms. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"basis":{"type":"number","description":"Basis. Last mark price minus index price in the interval"},"basis_bps":{"type":"number","description":"Basis (bps). Last mark-versus-index spread in basis points of the index price"},"mark_price_spread":{"type":"number","description":"Mark-Price Spread. Last mark price minus last traded price in the interval"},"mark_price_spread_bps":{"type":"number","description":"Mark-Price Spread (bps). Last mark-versus-last-price spread in basis points of the last price"},"basis_mean":{"type":"number","description":"Mean Basis. Average mark price minus index price in the interval"},"basis_bps_std":{"type":"number","description":"Basis Std Dev (bps). Standard deviation of the mark-versus-index spread in basis points"},"mark_price_spread_mean":{"type":"number","description":"Mean Mark-Price Spread. Average mark price minus last traded price in the interval"},"mark_price_spread_bps_std":{"type":"number","description":"Mark-Price Spread Std Dev (bps). Standard deviation of the mark-versus-last-price spread in basis points"}}},"FundingRow":{"type":"object","title":"Funding row","description":"Funding rate and update frequencies for perpetual futures contracts. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"funding_rate":{"type":"number","description":"Funding Rate. Last funding rate observed in the interval"},"funding_rate_update_frequency":{"type":"number","description":"Funding Rate Update Frequency. Average number of funding-rate updates per second in the interval"},"funding_rate_avg_update_interval":{"type":"number","description":"Avg Funding Rate Update Interval. Average seconds between funding-rate updates in the interval"}}},"OpenInterestRow":{"type":"object","title":"Open Interest row","description":"Open interest values with percentage change, volatility, and OI/price change ratio. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"open_interest":{"type":"number","description":"Open Interest. Last open interest value in the interval"},"open_interest_pct_change":{"type":"number","description":"Open Interest % Change. Percentage change in open interest from the first value to the last value in the interval"},"open_interest_volatility":{"type":"number","description":"Open Interest Volatility. Standard deviation of tick-to-tick open-interest percentage changes in the interval"},"oi_price_change_ratio":{"type":"number","description":"OI/Price Change Ratio. Open-interest return divided by mark-price return over the interval"}}},"DerivativePriceRow":{"type":"object","title":"Derivative Price row","description":"Snapshot of mark, index, and last trade prices with interval percentage changes and pairwise divergence ratios. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"last_price":{"type":"number","description":"Last Price. Last traded price observed in the interval"},"index_price":{"type":"number","description":"Index Price. Last index price observed in the interval"},"mark_price":{"type":"number","description":"Mark Price. Last mark price observed in the interval"},"last_price_pct_change":{"type":"number","description":"Last Price % Change. Percentage change from the first last price to the final last price in the interval"},"index_price_pct_change":{"type":"number","description":"Index Price % Change. Percentage change from the first index price to the final index price in the interval"},"mark_price_pct_change":{"type":"number","description":"Mark Price % Change. Percentage change from the first mark price to the final mark price in the interval"},"mark_index_pct_change_ratio":{"type":"number","description":"Mark/Index % Change Ratio. Mark-price return divided by index-price return over the interval"},"mark_last_pct_change_ratio":{"type":"number","description":"Mark/Last % Change Ratio. Mark-price return divided by last-price return over the interval"},"index_last_pct_change_ratio":{"type":"number","description":"Index/Last % Change Ratio. Index-price return divided by last-price return over the interval"}}},"OhlcvRow":{"type":"object","title":"Candlesticks row","description":"Open, High, Low, Close, Volume candlestick data with notional volume. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"open":{"type":"number","description":"Open. First trade price in the interval"},"high":{"type":"number","description":"High. Highest trade price in the interval"},"low":{"type":"number","description":"Low. Lowest trade price in the interval"},"close":{"type":"number","description":"Close. Last trade price in the interval"},"volume":{"type":"number","description":"Volume. Total traded quantity in the interval"},"volume_notional":{"type":"number","description":"Notional Volume. Total traded notional in the interval"}}},"VtwapRow":{"type":"object","title":"VWAP / TWAP row","description":"Volume-weighted and time-weighted average prices for precise execution benchmarks. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"vwap":{"type":"number","description":"VWAP. Trade-size-weighted average price in the interval"},"twap":{"type":"number","description":"TWAP. Arithmetic average trade price in the interval"}}},"L1PriceRow":{"type":"object","title":"L1 Price row","description":"Best bid and ask prices with quantities, midprice, quantity-weighted midprice, time/volume-weighted averages, and quote update frequency. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"ask_price":{"type":"number","description":"Ask Price. Last best ask price in the interval"},"bid_price":{"type":"number","description":"Bid Price. Last best bid price in the interval"},"ask_amount":{"type":"number","description":"Ask Amount. Last best ask quantity in the interval"},"bid_amount":{"type":"number","description":"Bid Amount. Last best bid quantity in the interval"},"quote_update_frequency":{"type":"number","description":"Quote Update Frequency. Number of top-of-book quote updates in the interval"},"avg_update_interval":{"type":"number","description":"Avg Update Interval. Average milliseconds between top-of-book quote updates"},"midprice":{"type":"number","description":"Mid Price. Midpoint between the last best bid and ask prices"},"weighted_midprice":{"type":"number","description":"Weighted Mid Price. Midprice weighted by the opposite-side top-of-book quantity"},"bid_price_twap":{"type":"number","description":"Bid Price TWAP. Average best bid price in the interval"},"ask_price_twap":{"type":"number","description":"Ask Price TWAP. Average best ask price in the interval"},"bid_price_vwap":{"type":"number","description":"Bid Price VWAP. Bid-price average weighted by best bid quantity"},"ask_price_vwap":{"type":"number","description":"Ask Price VWAP. Ask-price average weighted by best ask quantity"}}},"L1ImbalanceRow":{"type":"object","title":"L1 Imbalance row","description":"Bid/ask imbalance, ratio, percentages — both instantaneous (last) and averaged over the interval. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"imbalance":{"type":"number","description":"Imbalance. Last best-bid quantity minus best-ask quantity in the interval"},"imbalance_ratio":{"type":"number","description":"Imbalance Ratio. Last normalized difference between best-bid and best-ask quantity"},"bid_ask_ratio":{"type":"number","description":"Bid/Ask Ratio. Last best-bid quantity divided by best-ask quantity"},"bid_percentage":{"type":"number","description":"Bid %. Last share of top-of-book quantity resting on the bid side"},"ask_percentage":{"type":"number","description":"Ask %. Last share of top-of-book quantity resting on the ask side"},"imbalance_avg":{"type":"number","description":"Avg Imbalance. Average best-bid quantity minus best-ask quantity in the interval"},"imbalance_ratio_avg":{"type":"number","description":"Avg Imbalance Ratio. Average normalized bid-ask quantity imbalance in the interval"},"bid_ask_ratio_avg":{"type":"number","description":"Avg Bid/Ask Ratio. Average best-bid quantity divided by best-ask quantity in the interval"},"bid_percentage_avg":{"type":"number","description":"Avg Bid %. Average share of top-of-book quantity on the bid side"},"ask_percentage_avg":{"type":"number","description":"Avg Ask %. Average share of top-of-book quantity on the ask side"}}},"L1LiquidityRow":{"type":"object","title":"L1 Liquidity row","description":"Spread (absolute and bps), depth, dollar depth — instantaneous and interval-averaged. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"spread":{"type":"number","description":"Spread. Last best ask price minus best bid price in the interval"},"spread_bps":{"type":"number","description":"Spread (bps). Last bid-ask spread in basis points of the midprice"},"spread_depth_ratio":{"type":"number","description":"Spread/Depth Ratio. Last bid-ask spread divided by total top-of-book quantity"},"total_depth":{"type":"number","description":"Total Depth. Last total top-of-book quantity across bid and ask"},"dollar_depth_bid":{"type":"number","description":"Bid Dollar Depth. Last bid-side top-of-book notional"},"dollar_depth_ask":{"type":"number","description":"Ask Dollar Depth. Last ask-side top-of-book notional"},"total_dollar_depth":{"type":"number","description":"Total Dollar Depth. Last total top-of-book notional across bid and ask"},"spread_avg":{"type":"number","description":"Avg Spread. Average bid-ask spread in the interval"},"spread_bps_avg":{"type":"number","description":"Avg Spread (bps). Average bid-ask spread in basis points over the interval"},"spread_depth_ratio_avg":{"type":"number","description":"Avg Spread/Depth Ratio. Average spread-to-depth ratio over the interval"},"total_depth_avg":{"type":"number","description":"Avg Total Depth. Average total top-of-book quantity across bid and ask in the interval"},"dollar_depth_bid_avg":{"type":"number","description":"Avg Bid Dollar Depth. Average bid-side top-of-book notional in the interval"},"dollar_depth_ask_avg":{"type":"number","description":"Avg Ask Dollar Depth. Average ask-side top-of-book notional in the interval"},"total_dollar_depth_avg":{"type":"number","description":"Avg Total Dollar Depth. Average total top-of-book notional across bid and ask in the interval"}}},"L2ImbalanceRow":{"type":"object","title":"L2 Order Book Imbalance row","description":"Multi-depth (5, 10, 20, 25 levels) order book imbalance, ratio, and averages. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"imbalance_5":{"type":"number","description":"Imbalance (5 levels). Last top-5 bid quantity minus top-5 ask quantity"},"imbalance_10":{"type":"number","description":"Imbalance (10 levels). Last top-10 bid quantity minus top-10 ask quantity"},"imbalance_20":{"type":"number","description":"Imbalance (20 levels). Last top-20 bid quantity minus top-20 ask quantity"},"imbalance_25":{"type":"number","description":"Imbalance (25 levels). Last top-25 bid quantity minus top-25 ask quantity"},"imbalance_ratio_5":{"type":"number","description":"Imbalance Ratio (5 levels). Last normalized difference between top-5 bid and ask quantity"},"imbalance_ratio_10":{"type":"number","description":"Imbalance Ratio (10 levels). Last normalized difference between top-10 bid and ask quantity"},"imbalance_ratio_20":{"type":"number","description":"Imbalance Ratio (20 levels). Last normalized difference between top-20 bid and ask quantity"},"imbalance_ratio_25":{"type":"number","description":"Imbalance Ratio (25 levels). Last normalized difference between top-25 bid and ask quantity"},"bid_ask_ratio_5":{"type":"number","description":"Bid/Ask Ratio (5 levels). Last top-5 bid quantity divided by top-5 ask quantity"},"bid_ask_ratio_10":{"type":"number","description":"Bid/Ask Ratio (10 levels). Last top-10 bid quantity divided by top-10 ask quantity"},"bid_ask_ratio_20":{"type":"number","description":"Bid/Ask Ratio (20 levels). Last top-20 bid quantity divided by top-20 ask quantity"},"bid_ask_ratio_25":{"type":"number","description":"Bid/Ask Ratio (25 levels). Last top-25 bid quantity divided by top-25 ask quantity"},"imbalance_5_avg":{"type":"number","description":"Avg Imbalance (5 levels). Average top-5 bid quantity minus top-5 ask quantity in the interval"},"imbalance_10_avg":{"type":"number","description":"Avg Imbalance (10 levels). Average top-10 bid quantity minus top-10 ask quantity in the interval"},"imbalance_20_avg":{"type":"number","description":"Avg Imbalance (20 levels). Average top-20 bid quantity minus top-20 ask quantity in the interval"},"imbalance_25_avg":{"type":"number","description":"Avg Imbalance (25 levels). Average top-25 bid quantity minus top-25 ask quantity in the interval"},"imbalance_ratio_5_avg":{"type":"number","description":"Avg Imbalance Ratio (5 levels). Average normalized difference between top-5 bid and ask quantity in the interval"},"imbalance_ratio_10_avg":{"type":"number","description":"Avg Imbalance Ratio (10 levels). Average normalized difference between top-10 bid and ask quantity in the interval"},"imbalance_ratio_20_avg":{"type":"number","description":"Avg Imbalance Ratio (20 levels). Average normalized difference between top-20 bid and ask quantity in the interval"},"imbalance_ratio_25_avg":{"type":"number","description":"Avg Imbalance Ratio (25 levels). Average normalized difference between top-25 bid and ask quantity in the interval"},"bid_ask_ratio_5_avg":{"type":"number","description":"Avg Bid/Ask Ratio (5 levels). Average top-5 bid quantity divided by top-5 ask quantity in the interval"},"bid_ask_ratio_10_avg":{"type":"number","description":"Avg Bid/Ask Ratio (10 levels). Average top-10 bid quantity divided by top-10 ask quantity in the interval"},"bid_ask_ratio_20_avg":{"type":"number","description":"Avg Bid/Ask Ratio (20 levels). Average top-20 bid quantity divided by top-20 ask quantity in the interval"},"bid_ask_ratio_25_avg":{"type":"number","description":"Avg Bid/Ask Ratio (25 levels). Average top-25 bid quantity divided by top-25 ask quantity in the interval"}}},"L2LiquidityRow":{"type":"object","title":"L2 Order Book Liquidity row","description":"Total bid/ask depth aggregated over 5, 10, 20, 25 order book levels — instantaneous and interval-averaged. One row exactly as it was produced; a row received twice carries the same key (exchange, symbol, interval, timestamp type and time), so overwrite rather than append.","required":["symbol"],"additionalProperties":true,"properties":{"exchange":{"description":"The exchange the row is from."},"symbol":{"type":"string","description":"The Atlas symbol id."},"interval":{"type":"string","description":"The bar interval."},"timestamp_type":{"type":"string","enum":["exchange","true"],"description":"Whose clock bars are cut by: 'exchange' or 'true' (arrival)."},"time":{"description":"The bar open time."},"ask_agg_5":{"type":"number","description":"Ask Aggregate (5 levels). Last total ask quantity across the top 5 levels"},"ask_agg_10":{"type":"number","description":"Ask Aggregate (10 levels). Last total ask quantity across the top 10 levels"},"ask_agg_20":{"type":"number","description":"Ask Aggregate (20 levels). Last total ask quantity across the top 20 levels"},"ask_agg_25":{"type":"number","description":"Ask Aggregate (25 levels). Last total ask quantity across the top 25 levels"},"bid_agg_5":{"type":"number","description":"Bid Aggregate (5 levels). Last total bid quantity across the top 5 levels"},"bid_agg_10":{"type":"number","description":"Bid Aggregate (10 levels). Last total bid quantity across the top 10 levels"},"bid_agg_20":{"type":"number","description":"Bid Aggregate (20 levels). Last total bid quantity across the top 20 levels"},"bid_agg_25":{"type":"number","description":"Bid Aggregate (25 levels). Last total bid quantity across the top 25 levels"},"ask_agg_5_avg":{"type":"number","description":"Avg Ask Aggregate (5 levels). Average total ask quantity across the top 5 levels in the interval"},"ask_agg_10_avg":{"type":"number","description":"Avg Ask Aggregate (10 levels). Average total ask quantity across the top 10 levels in the interval"},"ask_agg_20_avg":{"type":"number","description":"Avg Ask Aggregate (20 levels). Average total ask quantity across the top 20 levels in the interval"},"ask_agg_25_avg":{"type":"number","description":"Avg Ask Aggregate (25 levels). Average total ask quantity across the top 25 levels in the interval"},"bid_agg_5_avg":{"type":"number","description":"Avg Bid Aggregate (5 levels). Average total bid quantity across the top 5 levels in the interval"},"bid_agg_10_avg":{"type":"number","description":"Avg Bid Aggregate (10 levels). Average total bid quantity across the top 10 levels in the interval"},"bid_agg_20_avg":{"type":"number","description":"Avg Bid Aggregate (20 levels). Average total bid quantity across the top 20 levels in the interval"},"bid_agg_25_avg":{"type":"number","description":"Avg Bid Aggregate (25 levels). Average total bid quantity across the top 25 levels in the interval"}}}}}}