# Skylit Docs > Documentation for Skylit: field guides to each module (Heatseeker, Flowseeker, Atlas, Nexus, Tempest, Talon), Heatseeker concepts and patterns, and the reference for the Skylit API and the Skylit MCP server (live market data; Beta, limited access). Every page is available as Markdown: append `.md` to its URL, as linked below. All pages in one file: https://www.skylit.ai/docs/llms-full.txt. Agent skill for the API and MCP server: https://www.skylit.ai/.well-known/agent-skills/skylit-api/skill.md. Search and read these docs from any MCP client (Claude, Cursor, VS Code, ChatGPT) with the Docs MCP: https://www.skylit.ai/docs/mcp (Streamable HTTP, no auth; tools search_docs, get_page, list_pages; setup: https://www.skylit.ai/docs/mcp/docs-mcp). It is separate from the Skylit MCP server (market data). OpenAPI specs: https://www.skylit.ai/docs/openapi.yaml, https://www.skylit.ai/docs/flowseeker-openapi.yaml, https://www.skylit.ai/docs/atlas-openapi.yaml. --- Source: https://www.skylit.ai/docs/platform/overview # Welcome to Skylit > Documentation for the Skylit platform: market-intelligence tools for active traders. Skylit is a suite of market-intelligence products that show the forces behind price, from dealer positioning to options flow, so you can read the market with more context. Pick a module to dive in. Each field guide covers what the module shows, how to read it and how to put it to work. - [Heatseeker](https://www.skylit.ai/docs/guides/heatseeker): Where dealers are positioned, every strike, every tenor ([product page](https://skylit.ai/modules/heatseeker)) - [Flowseeker](https://www.skylit.ai/docs/guides/flowseeker): Live options flow, every print, with context to read it. ([product page](https://skylit.ai/modules/flowseeker)) - [Atlas](https://www.skylit.ai/docs/guides/atlas): A live chart with dealer levels, flow and dark pool ([product page](https://skylit.ai/modules/atlas)) - [Nexus](https://www.skylit.ai/docs/guides/nexus): Paper trade options and review every trade. ([product page](https://skylit.ai/modules/nexus)) - [Tempest](https://www.skylit.ai/docs/guides/tempest): How much movement options are pricing, stock by stock. ([product page](https://skylit.ai/modules/tempest)) - [Talon](https://www.skylit.ai/docs/guides/talon): Agentic intelligence that reads the market with you ([product page](https://skylit.ai/modules/talon)) ## Learn the concepts - [Core concepts](https://www.skylit.ai/docs/core-concepts): Nodes, King and Gatekeeper nodes, midpoints, retests and other ideas behind reading dealer positioning. - [Patternpedia](https://www.skylit.ai/docs/patternpedia/pattern-the-whipsaw): Recurring Heatseeker setups and case studies. ## For developers - [API Reference](https://www.skylit.ai/docs/api-reference/introduction): Pull Skylit's data programmatically (heatmaps, nodes and options flow) over a REST API. ## Need help? - [Support](https://www.skylit.ai/docs/platform/support): Guides, community resources and how to reach the Trader Success team. --- Source: https://www.skylit.ai/docs/platform/support # Support > Guides, community resources and how to reach the Trader Success team. Need a hand? Here's where to go. - [Heatseeker guides](https://www.skylit.ai/docs/help-page/written-guides): Written walkthroughs and recommended reading for Heatseeker. - [Video resources](https://www.skylit.ai/docs/help-page/video-links): Curated video content to get up to speed. - [Community threads](https://www.skylit.ai/docs/help-page/useful-threads): Helpful discussions from the Skylit community. - [Launch the app](https://app.skylit.ai): Jump into Skylit in your browser. ## Reach the Trader Success team The Trader Success team helps members on every plan: - **Discord**: ask in the Skylit community. - **Email**: [support@skylit.ai](mailto:support@skylit.ai). - **In the app**: open support from inside [Skylit](https://app.skylit.ai). Pro members can also book 1:1 sessions with the team. --- Source: https://www.skylit.ai/docs/guides/overview # Skylit field guides > Plain-English guides to each Skylit module: what it shows, how to read it and how to put it to work. Each guide follows one module the way it appears in the app. Start with the module you use most; the guides link to each other where the modules work together. - [Heatseeker](https://www.skylit.ai/docs/guides/heatseeker): Where dealers are positioned, every strike, every tenor ([product page](https://skylit.ai/modules/heatseeker)) - [Flowseeker](https://www.skylit.ai/docs/guides/flowseeker): Live options flow, every print, with context to read it. ([product page](https://skylit.ai/modules/flowseeker)) - [Atlas](https://www.skylit.ai/docs/guides/atlas): A live chart with dealer levels, flow and dark pool ([product page](https://skylit.ai/modules/atlas)) - [Nexus](https://www.skylit.ai/docs/guides/nexus): Paper trade options and review every trade. ([product page](https://skylit.ai/modules/nexus)) - [Tempest](https://www.skylit.ai/docs/guides/tempest): How much movement options are pricing, stock by stock. ([product page](https://skylit.ai/modules/tempest)) - [Talon](https://www.skylit.ai/docs/guides/talon): Agentic intelligence that reads the market with you ([product page](https://skylit.ai/modules/talon)) > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. --- Source: https://www.skylit.ai/docs/guides/heatseeker # Heatseeker field guide > See where dealers are positioned at every strike and expiration, and where price may stall, bounce or speed up. > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. Past behavior of any reading or setup does not guarantee future results. ## Why it matters Price does not move through every level the same way. Some strikes carry so much dealer hedging that price tends to stall, bounce or pin there. Others are thin, and price slides through them fast. Heatseeker shows you where those strikes are, so you can plan around them before price arrives. For one ticker, Heatseeker shows **dealer exposure at every strike (rows) and every expiration (columns)**. Each cell is a **node**: a positive or negative dollar value, coloured by size. It answers one question: **where are dealers positioned heavily enough that price may react?** > **Info:** **In plain English.** Market makers take the other side of options trades and hedge by trading the underlying so they are not betting on direction. How much they have to re-hedge as price moves depends on gamma. A big GEX node is a strike where that hedging is heavy, so traders watch for a reaction when price gets there. You can read the board two ways, with the GEX/VEX switch at the top left of the page: - **GEX** (net gamma exposure) shows short-term dealer positioning. Day traders use it for intraday support and resistance. On indexes they watch the same-day (0DTE) column. On single names they watch the nearest expiration. - **VEX** (net vanna exposure) shows positioning that shifts with implied volatility. Traders use it for a longer view, roughly five days and out, and on days when volatility spikes. > **Info:** **In plain English.** Vanna is about implied volatility, not price. When IV rises or falls, options' deltas shift, and dealers re-hedge even if the stock has not moved. VEX shows where that effect is concentrated, which is why traders lean on it for multi-day reads and on days when volatility spikes. Many traders look for places where GEX and VEX agree. That is a trader habit, not a tested signal. ### Colour, sign and size - On the default palette (viridis), **yellow** is the highest value on the board and **purple** the lowest. Greens and blues sit in between. Other palettes use other colours. - The colours stretch from the board's lowest value to its highest, so zero has no fixed colour. - **Read the number, not the colour.** A purple- or blue-looking cell without a minus sign is still a positive node. - **Size matters more than sign or colour.** Skylit's lessons teach that the biggest node, positive or negative, pulls hardest. - **Positive does not mean bullish, negative does not mean bearish.** The lessons teach that sign describes *how* price tends to move through a level: - Positive nodes dampen moves and give smoother reactions. - Negative nodes give wicky, fast moves that can overshoot before they reverse. That is teaching, not a measured result. ### Named nodes | Name | What it is | | --- | --- | | **King** | The strongest node on the board, marked with a star. The Academy teaches it as a level price is often drawn to, especially into the close. That is teaching, not a tested result. | | **Pika** | A positive node (the Academy's "yellow node"). The right-click label marks only the standout ones. | | **Barney** | A negative node (the Academy's "purple node"). The right-click label marks only the standout ones. | | **Gatekeeper** | A large node between price and the King that can block the way there. Check where a labelled Gatekeeper sits against price and the King before you lean on it. | | **Floor / ceiling** | A large node below price (floor) or above it (ceiling). It can be positive or negative. | Right-click a cell and the menu names the node's role when it has one ("King node", "Pika node", and so on). The Academy is Skylit's lesson library (see "To learn more" below). ## Where to find it - **One ticker's board:** Heatseeker → **Heatmaps**. It is the app's home page. - **SPXW, SPY and QQQ together:** Heatseeker → **Trinity Mode**, or press `Shift+T` on the Heatmaps page. - **Your alerts and tracked nodes:** Heatseeker → **Alerts**. - **Nodes on a chart:** **Atlas** (also in the Heatseeker menu). - **Keyboard shortcuts:** press `?` anywhere in the app. ![The Heatseeker heatmap for SPX: strikes down the side, expirations across the top and the control bar above the board.](https://www.skylit.ai/docs/images/guides/heatseeker/board.light.webp) ### The control bar Almost every control sits in the bar above the board. Hover a button to see its name. On a computer: - **Left side:** the GEX/VEX switch, **Center on Spot Price** and **Center on King Node**, and the lightning button for velocity. **Movers** appears here once velocity is on. - **Right side:** **Refresh map**, replay (`Shift+R`), **View** (View Controls), the sliders button (Node %), **Copy image** and **Save image**. On a phone the bar sits at the top of the screen and scrolls sideways. It has the same buttons in a different order. ### To learn more - The Academy's Heatseeker track. - The Learn pages on skylit.ai/docs: Core Concepts, Examples & Case Studies and Patternpedia. - Skylit's own channel, [Skylit on YouTube](https://www.youtube.com/@Skylit_AI). - Videos from the team and community: [Glitch](https://www.youtube.com/@Glitch_SPX), [John Wicks](https://www.youtube.com/@The_John_Wicks), [Nicog8](https://www.youtube.com/@nicog8_trading), [Garma](https://www.youtube.com/@garma_donM4), [Giul](https://www.youtube.com/@giul_trades) and [DixonQ](https://www.youtube.com/@r2q2). ### Plans What you can open depends on your plan. Full Heatseeker access covers 5,000+ tickers; some plans cover index tickers only. If a page shows an upgrade card instead of the tool, your plan does not include it. ## Read it in 30 seconds These steps follow the docs and the Academy. They are reading habits, not tested rules. 1. **Find the King.** It is the starred cell. Note where it sits relative to price and how far away it is. 2. **Find the floor and ceiling.** They are the biggest nodes just below and just above price. Together they mark the edges of the range. 3. **Is price at an edge or in the middle?** Edges are where traders look for a reaction. Many traders avoid the middle of a range, where risk and reward are about even. 4. **Is the board building or melting?** Turn on velocity (the lightning button). Building nodes are growing; melting nodes are shrinking. Lessons teach that growing nodes near price pull it in, and shrinking ones lose their hold. 5. **Do SPX, SPY and QQQ agree?** For index trades, open Trinity. When they disagree, many traders stand aside. Lessons differ on whether two of the three agreeing is enough. ![The SPY heatmap with the King node, the starred cell, highlighted in yellow.](https://www.skylit.ai/docs/images/guides/heatseeker/king.light.webp) Heatseeker is context, not a trigger. Many traders wait for price action to confirm a level before they act. ## How to use it ### Pick a ticker Get to the board you want in a keystroke, and keep it there when you refresh or share the link. 1. Type any letter or `/` to open search, or pick from the ticker dropdown. 2. Use the left and right arrow keys to step through the list. 3. To pin a ticker, star it in the ticker list, or use **+** on the favourites row. 4. Press `Cmd+K` (`Ctrl+K` on Windows) to open the watchlist picker. Create, edit and search watchlists from there. The ticker stays in the page address (`?symbol=SPY`), so a refresh or a shared link opens the same ticker. ### Switch between GEX and VEX GEX is for today's levels; VEX is for multi-day bias and volatile days. 1. Click the **GEX** or **VEX** tab at the top left of the board. 2. The board, the King and velocity all follow the view you pick. The keyboard shortcuts shown on the tabs do not reliably switch the board yet, so click the tabs. ### Read the board - Rows are strikes, columns are expirations. The strike nearest the current price is highlighted. - Hover a cell to see its value. - With **Raw hover** on (in the Node % panel), hover always shows the dollar value, even when the board shows percentages. - **Center on Spot Price** keeps the board scrolled to price as it moves. **Center on King Node** keeps it on the King. Click the same button again to stop. ### Right-click a node (long-press on a phone) Set an alert or start watching a level straight from the board, without typing a price. 1. Right-click any cell (long-press on a phone). 2. Choose what the alert follows: - the node's role (**King node**, for example), which follows the node if it moves to another strike, or - the exact **\$level**. 3. Pick an action from the table. ![The menu that opens on the SPY King node: follow the King node or the $772 level, then Alert as it approaches, Alert at the tap, Track node size or Hide this strike.](https://www.skylit.ai/docs/images/guides/heatseeker/node-alert.light.webp) | Action | What it does | | --- | --- | | **Alert as it approaches** | Fires as price gets close to the node. The margin setting next to it sets how close, from a quarter of the gap between two strikes up to one full gap. | | **Alert at the tap** | Fires once, when price touches it. | | **Track node size** | Adds the node to your tracked list so you can watch it build or melt over the day. | | **Hide this strike** | Removes a row from the board. The hidden-strikes chip or View Controls brings it back. | ### View Controls Show as much or as little of the chain as you need, and calm a noisy board. 1. Click **View** (the grid button on the right of the control bar). On a phone it is the first button in the top bar. 2. Pick a **zoom** preset: tight, normal or wide. 3. Set **Strike Range** (how many strikes around price) and **Expirations** (how many columns). Quick picks: 1W, 1M, 3M, 6M and All. 4. To hide clutter, use **Hide strikes under** a value. You can also hide strikes that have no value in the columns shown. 5. **Reset** (top of the panel) returns strike range, expirations and zoom to their defaults. 6. Hidden strikes come back from the strike picker's reset or from the hidden-strikes chip. ![The View Controls panel open over the board: quick presets, Strike Range and Expirations sliders, and Hide strikes.](https://www.skylit.ai/docs/images/guides/heatseeker/view-controls.light.webp) ### Node % See at a glance how big each node is next to the King. This changes how values are *shown*, not what they are. One setting covers the heatmap, Trinity and the heatmap panels on Atlas charts. 1. Click the sliders button, next to **View** in the control bar. 2. Pick a **Preset**: - *Off* shows plain values. It is the default. - *Focus* shows values as a share of the King, and hides or dims small nodes. - *King* keeps only the King readable. 3. Under **Read as**, choose dollar value or **% King**. The King is always 100%. 4. Under **Low nodes**, pick **Hide**, **Dim** or **Fade** for nodes below a share of the King you choose. 5. Pick a **Palette**. There are seven colour maps. The picker marks which are colour-blind safe; cividis is the recommended one. 6. To keep a combination, save it as a named preset. It follows you across devices. ![The Node % panel: Preset, Read as, Low nodes, Palette and a preview of the colour scale.](https://www.skylit.ai/docs/images/guides/heatseeker/node-percent.light.webp) ### Velocity A level that grows as price approaches tends to matter more than one that is shrinking. Velocity shows which is which. 1. Click the lightning button in the control bar to turn velocity on. 2. Pick a timeframe from the menu beside it: 1 min, 5 min, 10 min, 15 min, 1 hour, 4 hours or 1 day. 3. Read the badges on the cells. "Increasing" means the node is getting bigger, whatever its sign. A negative node going from -100 to -150 is increasing. 4. To see only growing or only shrinking nodes, use the direction menu: All, Increasing or Decreasing. 5. Click **Movers** for the fastest-growing and fastest-shrinking nodes, and your tracked nodes. The button shows up once there are movers to list. 6. In the timeframe menu, switch the halo on (**Halo · must agree**). It marks strikes where velocity agrees across the timeframes you pick (at least two). ![Velocity switched on with the timeframe menu open: 1 min to 1 day, and the Halo · must agree setting.](https://www.skylit.ai/docs/images/guides/heatseeker/velocity.light.webp) For day trades, many traders use 5 to 15 minutes, because 1 minute flips every bar. That is a habit, not a tested setting. ### Replay Check whether price already reached a level and left ("delivered") before you lean on it. Or review a past session. 1. Press `Shift+R`, or click the replay button on the right of the control bar. 2. Pick a date and time. Times are always Eastern. You can also jump to **NOON**, and on index tickers to **NY OPEN**. 3. Press play to run the board forward. 4. Press `Shift+R` or the replay button again to go back to the live board. The board does not flag which levels are delivered and which are fresh, so replay is how you check. ### Copy and save image Grab the board as a picture for a trading journal or a Discord post. 1. Click **Copy image** (right end of the control bar) to put the board on your clipboard, ready to paste. 2. Or click **Save image** to download it as a PNG file. ### Trinity Index traders read SPX, SPY and QQQ together. Trinity puts them side by side so you can see at a glance whether they agree. 1. Open Heatseeker → **Trinity Mode**, or press `Shift+T` on the Heatmaps page. 2. You see SPXW, SPY and QQQ, on GEX by default. Use the GEX/VEX switch in Trinity's control bar to change view. 3. Velocity, Center on Spot / Center on King, Node % and replay work here too, from the same bar. 4. To add a ticker, click **Add ticker panel** (the **+** button). You can have up to six panels. They stay put after a refresh. 5. To leave, click **Close Trinity mode**. ![Trinity mode with the SPXW, SPY and QQQ boards side by side.](https://www.skylit.ai/docs/images/guides/heatseeker/trinity.light.webp) > **Tip:** **Same values, different shading.** Trinity has its own colour-scale setting: scale by the first column, or by view settings. So the same strike can be shaded differently here and on the single-ticker board. The values are the same; read those. ### Alerts Let the app watch your levels so you do not have to stare at the board. 1. Open Heatseeker → **Alerts**. Everything you set from a node lives here, in two tabs: **Alerts** and **Tracked**. 2. Click **Create Alert** to build an alert by hand. Pick tickers or a watchlist, then a node type or a custom price level. 3. Or click **Smart Alerts** to set approach alerts in one click. It covers the King, Pika and Barney nodes, on GEX and VEX, for every ticker in the watchlist you pick. 4. Open **Tracked** to see how each tracked node has grown or shrunk since you added it. ## Use it with other Skylit tools - **Atlas (the chart).** Read levels against candles without switching screens. - Heatseeker nodes appear on the chart as orbs. - `Shift+H` opens a heatmap panel beside the chart, and `Shift+T` a Trinity panel. - Dark pool levels sit on the same chart. - On futures charts, Atlas can show levels from a related options chain. - **Flowseeker (who is trading).** Flow shows what traders are doing; Heatseeker shows where dealers are positioned. Some traders look for flow arriving at a large node. That is a habit, not a tested signal. - **Alerts (so you do not have to watch).** Set approach and tap alerts on the King or any node, straight from the board. - **Talon (plain-English reads).** Ask for levels, Trinity agreement or a setup scan without leaving the page. See below. ## Ask Talon Get a plain-English read of the map, or check another ticker, without leaving the page. Talon is Skylit's AI assistant. It lives in the Aegis panel. 1. Open the Aegis panel: click the bubble, or press `Cmd+\`. 2. Type a question or a slash command from the table below. 3. On the heatmap page, Talon reads the same board you are looking at. Name another ticker and it fetches that one too. If Talon is not on your plan, the Aegis panel does not show a Talon tab. Talon describes the map. A setup scan (`/talon`) describes the levels and structure around a ticker or trade idea. Talon does not tell you to buy or sell, and it does not size positions. It also will not explain how exposure is calculated. | You want | Ask Talon | | --- | --- | | Levels for this or another ticker | `/levels` · `/levels SPXW` · "Where is QQQ's King?" · "What's above and below spot on NVDA?" | | The three indexes together | `/trinity` · "Do SPX, SPY and QQQ agree right now?" | | A setup scan | `/talon TSLA` · `/talon sector semis` · `/watchlist` (scans your Atlas watchlist) | | How the board changed | "Did the 110 node on AAPL grow since last week?" · "Has the King moved today?" | | Whether a level has been tested | "When did SPY last touch 580?" · "Was 110 tested this week?" | | Flow and context next to the map | `/flow` · `/darkpool` · `/metrics` · `/market` · `/earnings` | | A definition | "What is a gatekeeper?" · "What is a beach ball?" · "What does delivered mean?" | How it behaves: - **The ticker you type wins.** `/levels SPXW` answers for SPXW even if the page shows SPY, and every level is labelled with its ticker. - **Trinity answers say whether the three agree**: all three, two of three, or divergence. - **Velocity is a word, not a rate.** From the heatmap page Talon can say a node is building or thinning. It cannot say how fast. ## Good to know - **Heatseeker is not a signal.** It shows where dealers are positioned. It does not predict direction. Many traders wait for price action. - **The map can change within minutes.** When it reshuffles, old levels may stop mattering. Re-read the board before you rely on them. - **Big events move the map.** OPEX week, FOMC, CPI, NFP and the last half hour of the session can distort or reshuffle it. Large hedge nodes far from price often appear around these events. - **Lesson numbers are rough.** You may see figures in lessons or the docs, such as how often a node holds on a second touch. They are teaching guides, not measured results, and sources give different numbers. - **The playbooks are habits, not proof.** Reading tips in this guide and in the Academy are trader habits, not tested signals. That covers magnets, the King pin, trading against range edges and cross-index agreement. Sources sometimes disagree on the details. - **Use the tabs for GEX and VEX.** The keyboard shortcuts shown for them do not reliably switch the board yet. - **Talon's history answers are newer.** Some questions may come back unavailable or less complete than a levels read. That applies to how a node changed over time, and whether a level is fresh or tested. Check those on replay. - **Colour-blind use.** The palette picker marks which palettes are colour-blind safe; cividis is the recommended one. Velocity badges show a signed percentage next to red and green. Other red and green cues in the app have not all been checked for colour-blind use. ## What's new **September 2026** - **Tracked nodes follow you across devices.** Nodes you track now save to your account instead of just one browser. Sign in on another device and your list is there, updating automatically within about a minute or when you switch back to the tab. See [Named nodes](#named-nodes). - **Your ticker survives a refresh.** The ticker you pick now stays in the page address, so a refresh or a shared link opens that same ticker instead of SPXW. See [Pick a ticker](#pick-a-ticker). - **Steadier Trinity ladders.** Trinity columns keep their full strike range after you switch tabs, rows stay aligned when the browser is zoomed out, and resizing re-centres the board. See [Trinity](#trinity). - **Negative values in Trinity read cleanly.** The minus sign on Trinity values matches the digits' width and height again, so you can spot negative nodes at a glance. See [Trinity](#trinity). - **View Controls show the full chain.** The Strike Range and Expirations sliders now reach every strike and expiration the ticker has, so you are no longer stuck at five expirations. See [View Controls](#view-controls). **August 2026** - **Trinity remembers your panels.** Tickers you add, remove or swap in Trinity Mode stay put after a refresh, so you never rebuild your layout from SPXW, SPY and QQQ. See [Trinity](#trinity). - **No more blue wash over the board.** Dragging across the heatmap or resizing the window no longer highlights the whole grid as selected text, so your board stays readable, especially in Safari. See [Read the board](#read-the-board). - **Hide strikes and see what is hidden.** Hide a strike from its right-click menu or by value in View Controls. Hidden strikes show struck through, so you can bring any back. See [View Controls](#view-controls). - **Expirations slider in View Controls.** Pick any number of expiration columns with the new slider, not just the 1W to All presets. Both sliders now work with arrow keys. See [View Controls](#view-controls). - **Strikes that never trade are gone.** Listed strikes that have never traded no longer show as empty rows, so you will not mistake them for gaps in dealer positioning. See [Read the board](#read-the-board). - **No flicker when switching tickers.** As you step through tickers, the board no longer flashes down to a single column before settling, so each ticker appears cleanly. See [Pick a ticker](#pick-a-ticker). Every Heatseeker update: [skylit.ai/changelog/heatseeker](https://www.skylit.ai/changelog/heatseeker). ## Glossary | Term | Meaning | | --- | --- | | **Air pocket** | A zone with little exposure, which price can cross quickly. Faster through negative exposure, slower through positive. A path, not a target. | | **Barney** | A negative node (the Academy's "purple node"). The right-click label marks only the standout ones. Negative means volatile interactions, not bearish. | | **Beach ball** | Price punches through a big node, then snaps back to it. | | **Ceiling** | A large node above price that tends to slow or turn upward moves. Either sign. | | **Confluence** | Agreement: across SPX, SPY and QQQ, or between GEX and VEX, or between the map and the chart. | | **Delivered** | A node price has already reached and left. Lessons teach it carries less pull next time. | | **Deflection** | The bounce or rejection when price reaches a node. | | **Floor** | A large node below price that tends to slow or turn downward moves. Either sign. | | **Fresh node** | A node price has not touched yet. | | **Gatekeeper** | A node between price and a larger target (in the docs, the King) that can block the way there. A failed test there often reshuffles the map. | | **GEX** | Net gamma exposure. Short-term dealer positioning. | | **Hedge node** | A large, slow-moving node far from price, common around major events. Acts like insurance more than a magnet. | | **King** | The strongest node on the board, marked with a star. | | **Midpoint** | The middle of a range, where many traders see risk and reward as about even. | | **Node** | One cell: the exposure at one strike and one expiration. | | **Node %** | Reading each value as a share of the King. | | **OPEX** | Monthly options expiration, the third Friday. Nodes can carry less weight that week. | | **Pika** | A positive node (the Academy's "yellow node"). The right-click label marks only the standout ones. Positive means dampened interactions, not bullish. | | **Reshuffle** | A fast change in the map's structure. Re-read the board before relying on old levels. | | **Rolling** | A floor moving up or a ceiling moving down over time. | | **Rug / reverse rug** | A positive node stacked on a negative one above price (rug), or the mirror image below price (reverse rug, or trampoline). | | **Trinity** | SPXW, SPY and QQQ read together. | | **Velocity** | How fast a node is growing or shrinking in size, over a chosen timeframe. | | **VEX** | Net vanna exposure. Positioning that shifts with implied volatility; used for longer-horizon bias. | | **Wall** | Trader shorthand for a large node price has to get through, usually a floor or ceiling. The Talon and Atlas guides use it. | --- Source: https://www.skylit.ai/docs/guides/flowseeker # Flowseeker field guide > See where money is going in the options market right now, and whether it looks like a brand-new position or just noise. > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. Past behavior of any reading or setup does not guarantee future results. ## Why it matters Big options orders show you where other traders are putting real money. Flowseeker lets you watch that money as it trades. Two words come up everywhere in this guide. A **print** is one reported trade. **Flow** is the stream of those prints. Every page answers one question: **who is putting money into which options right now, and does it look like a new position?** You can look at flow at three levels: | Level | What you see | Where | | --- | --- | --- | | The print | One trade: contract, where it filled against the bid and ask, size, dollars paid, open interest | Live Feed, Dark Feed (stock prints) | | The contract | A contract's whole session: volume, dollars traded, change in open interest, bid/ask mix | Flow Scanner, Contract Lookup, Contract Drilldown | | The market | Flow summed or ranked across names, sectors and strikes | Flow Compass | ## Where to find it Flowseeker has its own section in the left sidebar: **Live Feed, Dark Feed, Flow Scanner, Flow Compass, Contract Lookup, Company Events, Flow Tracker, Flow Alerts**. **Settings** also appears if your account has Discord or API access. On a phone, the same pages sit in the Flowseeker bar: Live Feed, Dark Feed, Flow, Compass, Lookup, Events, Tracker, Alerts. Flowseeker is included in the Community, Initiate and Pro plans. The first time you open it, you are asked to sign the OPRA market-data agreement. OPRA is the body that publishes US options trades. Nothing loads until you sign, and you only sign once. | You want | Go to | | --- | --- | | Every print, live or for a past date | Flowseeker > Live Feed (Trade Date filter for history) | | Off-exchange stock prints | Flowseeker > Dark Feed | | Busiest contracts of the session | Flowseeker > Flow Scanner (presets: Bullish Flow, Bearish Flow, Call Sells, Put Sells) | | Market-wide boards, strike ladder, tide | Flowseeker > Flow Compass | | One ticker or contract | Flowseeker > Contract Lookup, or click any row for the Contract Drilldown | | Earnings, dividends, splits, insiders, Congress | Flowseeker > Company Events | | Positions you are following | Flowseeker > Flow Tracker | | Alerts | Flowseeker > Flow Alerts (delivery is set in Notifications) | | Discord channels, summary sections, API keys | Flowseeker > Settings (accounts with Discord or API access) | | Flow on a price chart | Atlas > Add menu: Flow, Net Premium, Flow VWAP, Dark Pool | | Ask in plain English | Talon: see [Ask Talon](#talon) | | API docs | skylit.ai/docs > Flowseeker > API Reference, and MCP Server (for connecting AI tools) | ## Read it in 30 seconds ### The readings, and the question each answers | Reading | Question it answers | | --- | --- | | **Side** | Where did the print fill: below bid, bid, mid, ask, above ask? Ask-side leans buying, bid-side leans selling. It says nothing certain about intent. | | **Premium** | How many dollars changed hands (price × size × 100)? | | **Vol/OI** | Is today's volume large next to the contracts already open? Above 1 means more traded today than was open at yesterday's close. | | **Size > OI** | Was a single print bigger than all the open interest? The strongest hint that a position is being opened, not closed. | | **Delta OI** | Did open interest actually grow after the session? This is the confirmation, and it arrives the next morning. | | **Flow Score** | How directional a print looks, from -100 (bearish) to +100 (bullish). A ranking aid, not a forecast. | | **Sweep** | Was the order filled across several exchanges at once? Sweeps suggest urgency, not direction. | | **Multi-leg** | Was the print part of a spread or combo? If so, the single leg's direction can mislead. | | **Cross** | Were both sides matched before the print? Then its side is not a sign of aggression. | | **NCP / NPP** | Net call premium and net put premium. Each nets aggressive buying against aggressive selling, for calls and for puts. | > **Info:** **In plain English.** Every option has a bid (what buyers offer) and an ask (what sellers want). Paying the ask means someone was in a hurry to buy; hitting the bid means someone was in a hurry to sell. That is all side tells you. A hedge, a close and one leg of a spread can all print at the ask. > **Info:** **In plain English.** Volume counts contracts that changed hands today. Open interest counts contracts that were still open at last night's close. If 5,000 contracts trade in a strike that had 800 open, more changed hands today than existed yesterday. That can be new positions, or the same contracts traded back and forth. The next morning's open interest (Delta OI) tells you which. ### Read one print in six steps 1. **Single-leg or multi-leg?** If it has a multi-leg or cross flag, open it before you read direction. A big call buy is often one leg of a spread. 2. **Where did it fill?** Ask or above ask leans bought; bid or below bid leans sold. Mid tells you little. 3. **Size against open interest.** Size > OI or high Vol/OI on the ask side is the strongest hint of a new position. Tomorrow's Delta OI confirms or retracts it. 4. **Premium for this name.** \$500K is routine on SPY and large on a small cap. 5. **Expiry and strike.** Short-dated, out-of-the-money size is a bet on a move soon. Long-dated or in-the-money size is more often a hedge or stock replacement. 6. **Then look at the chart.** Click the row to open the contract, or open the ticker on Atlas, to see where the print sits against price and Heatseeker levels. > **Note:** **Rule of thumb.** A print is a clue, not a thesis. Look for two or three clues that agree (side, size vs OI, repetition, a level) before you call it positioning. ## How to use it Not sure where to start? Many traders pick a page by trading style. Each page named here is explained further down. | Style | Start with | Watch for | | --- | --- | --- | | **0DTE (expires today) / intraday** | Strike Flow on SPY and QQQ (1M to 15M windows), a Live Feed tab with DTE 0 and single-leg | Buying vs selling at the strikes nearest spot; Market Tide slope | | **Swing** | Repetitive Hits, Large Opening Orders, Flow Tracker | New size that survives into the next day's open interest | | **Reversal** | Heatseeker levels, Strike Flow at the level | Put selling into a floor, call selling into a ceiling | | **Premium sellers** | Flow Scanner presets Call Sells and Put Sells | Who else is selling, and at which strikes | | **Earnings** | Company Events, Live Feed earnings filter | Size into the report vs the stock's history; IV going in | ### Live Feed **Why it matters:** this is the tape. Every row is **one trade**, so you see big orders the moment they print. **Where:** Flowseeker > Live Feed. 1. Check the **status pill**. LIVE means it is streaming. PAUSED means you are viewing history or paused it. CONNECTING or OFFLINE means the stream dropped. 2. Open **Filters** to narrow the tape. Good first filters are ticker, Type (calls or puts), Side, Days to Expiry and Premium. To exclude a ticker, type `!TICKER`. - The panel also has Flow Score range, Equity Type (stocks, ETFs, indices), Trade Date, Expiry Date, Open Interest, Volume, Vol/OI Ratio, Size and % OTM. - And more: stock, strike and contract price, Days to Earnings, IV % and IV Inflation, the contract's Ask %, Bid % and Skew %, and sector and industry. 3. Flip the quick toggles you need: Volume > OI, Size > OI, Exclude Deep ITM, OTM Only, Multi-Leg Only, Single-Leg Only, Sweeps Only, Crosses Only. 4. Open **Columns** to show, hide and reorder columns. The choices are Date/Time, Ticker, Strike, C/P, OTM, Exp, DTE, Fill, Spread, Side, Flow Score, Contract Ratio, Size, Prem, Vol, OI, ΔOI, Spot, IV, V/OI, Strategy and Earnings. 5. Turn on **Flow Highlighting** at the foot of the Columns panel. It colours rows whose volume or size is above open interest, in colours you pick. Prints big enough to be new positions then stand out while the feed scrolls. 6. Save the setup as a tab. Each **feed tab** keeps its own filters, columns, sort and highlighting. Use **Add new feed tab**, **Rename** and **Duplicate** to keep setups side by side, for example "0DTE SPY" or "Earnings week". ![The Live Feed: one row per trade, with columns such as Ticker, Strike, C/P, Exp, Fill, Side, Flow Score and Size.](https://www.skylit.ai/docs/images/guides/flowseeker/live.light.webp) What you can do with a row: - **Click** it to open the Contract Drilldown. - **Right-click** it to **Track trade**, or right-click a filterable cell (such as Ticker or Side) to **Show matching** or **Filter out** that value. Accounts with Flowseeker sharing also get **Add to summary**. - A **multi-leg** row opens a strategy view with its strike structure. - A **cross badge** marks a cross that was paired with a stock hedge. Click it to see both legs. - **Share** (top right) copies or saves an image of the feed, or downloads the rows as CSV. > **Tip:** **Empty feed?** Check the status pill and the Trade Date filter first. A tab left on a past date shows PAUSED and no new prints. ### Dark Feed **Why it matters:** large off-exchange stock trades show the prices where big blocks of shares changed hands. Many traders keep those prices on their radar. **Where:** Flowseeker > Dark Feed. 1. Read the columns: Date / Time, Ticker, Price, Size, Notional, % AvgVol and Sector. 2. Filter by ticker, Trade Date, Notional, Size, Share Price, AvgVol (as a % of average daily volume) and Sectors. It has its own tabs and columns, like the Live Feed. 3. Look for unusually large prints and note their price. How to read it: a dark-pool print has no side, so it is not bullish or bearish by itself. Many traders treat large prints as **levels of interest**, especially where they line up with a Heatseeker level. That is a habit, not a tested rule. ### Flow Scanner **Why it matters:** it answers "which contracts are unusually busy today?" rather than "what just printed?". Every row is **one contract**, summed over the session. **Where:** Flowseeker > Flow Scanner. 1. Pick a preset. - **Bullish Flow** and **Bearish Flow** find calls or puts on stocks that traded mostly at the ask, mostly single-leg. In-the-money strikes are left out. - **Call Sells** and **Put Sells** are the versions that traded mostly at the bid. They also include ETFs, and Put Sells keeps in-the-money strikes. 2. Adjust the filters the preset filled in. Once you change one, the preset name shows "(modified)". Extra filters include Exclude 0DTE, Exclude ITM, OPEX Only, a contract skew range, Sentiment and Chain Sentiment, and OI Growth. 3. Read the columns. Most match the Live Feed (Date/Time is the last trade). The ones to learn: - **Avg** (volume-weighted price) and **Last** price, **Chg%** and **Day%**. - **ΔOI** and **ΔOI%**: change in open interest since the last session. - **%Tot**: this contract's share of total market volume. - **Bull/Bear** and **Chain Bull/Bear**: the bullish/bearish split for the contract and for the whole ticker (see the Glossary). - **Contract Ratio**: how aggressively the contract traded, as its bid/ask mix. ![The Flow Scanner on the Bullish Flow preset, with its filters in the panel on the right.](https://www.skylit.ai/docs/images/guides/flowseeker/scanner.light.webp) The table lists the top 100 contracts by premium and refreshes every few seconds. ### Flow Compass **Why it matters:** one board takes you from the whole market down to a single contract. You see where money is concentrating without scanning thousands of prints. **Where:** Flowseeker > Flow Compass. 1. Start at the market cards (Market Tide, Net Impact, Top Industries) to see the day's lean. 2. Move to a ticker (Strike Flow) or to screens that surface contracts (Aggressive Bets, Repetitive Hits, Large Opening Orders). 3. Press a card's **info** button for its full definition, and hover for exact figures. 4. Drag rows and cards into your own order. ![Flow Compass: the Market Tide card above the Breadth Heat Calendar.](https://www.skylit.ai/docs/images/guides/flowseeker/compass.light.webp) Most cards refresh about once a minute while the tab is visible and pause while it is hidden (Strike Flow's 1M and 3M windows refresh faster). | Card | What it answers | | --- | --- | | **Breadth Heat Calendar** | Per sector, what share of stocks closed above their own recent average. Broad or narrow participation. Daily; it does not move intraday. | | **Rotation Map** | Each sector against the broad market: leading, weakening, lagging, improving. Press play to replay the rotation. | | **Net Impact** | Today's most bullish and most bearish names by net premium (NCP minus NPP). Indices and broad ETFs are excluded. | | **Strike Flow** | One ticker, strike by strike. Call premium is on the left, put premium on the right. Each is split into bought (above the mid) and sold (below the mid). Mid prints are left out of the bars and shown on hover. Opens on SPY, with a second card on QQQ. Windows run from 1M to DAY (it opens at 15M). REPLAY steps through an earlier session a minute at a time. | | **Aggressive Bets** | Heavily bought, out-of-the-money, single-leg contracts whose volume is unusual for that contract. Ranked by how unusual, not by size. | | **Top Industries** | Today's premium grouped by industry and ranked by net directional flow. Click an industry for its leading tickers. | | **Repetitive Hits** | Contracts hit this week by several similar-size, ask-side bursts. The pattern can mean someone is building a position in pieces. | | **Large Opening Orders** | Today's largest bought-to-open single-leg orders, where the order was bigger than the contract's open interest. | | **Market Tide** | The whole market's cumulative NCP and NPP through the session, with SPY on the right axis for context. Step back through past sessions with the arrows or the calendar. | ![Strike Flow cards for SPY and QQQ: call premium to the left of each strike and put premium to the right.](https://www.skylit.ai/docs/images/guides/flowseeker/compass-strikes.light.webp) > **Warning:** **Two things that trip people up.** > > - Scope differs by card: market-wide, one industry, one ticker, one contract. > - Colours on Strike Flow are aggression, not direction. Sold calls are not the same as bought puts. ### Contract Lookup and Contract Drilldown **Why it matters:** when a name catches your eye, this shows everything traded in it in one place. You can tell one loud print from real, repeated interest. **Where:** Flowseeker > Contract Lookup, or click any row anywhere for the Contract Drilldown. 1. Type a ticker (`TSLA`) for its overview, or a contract (`TSLA 6/20 135 C`) to go straight to it. 2. Read the overview at the top: spot price and daily move, call, put and net premium, the put/call ratio (P/C) and the bullish/bearish mix. 3. Below it are five boards: Top Volume, Top Premium, Top Open Interest, Unusual · Vol / OI and Top Sweeps. Top Sweeps ranks contracts by premium traded as sweeps, with **Swept %**, the share of the contract's volume that was swept. 4. Switch the boards between **1D**, **7D** and **1M**. Volume and premium are summed over the window; open interest and DTE come from the latest session. 5. Tick **Single-leg only** to hide contracts where multi-leg trades drive a large share of premium, so big spreads don't crowd the boards. 6. Open a contract for the **Contract Drilldown**. It shows: - flow bars through the day (click a bar to see the prints behind it) - the bid/mid/ask mix - net premium, split into calls bought and sold and puts bought and sold - the Flow Orders table and the contract's Vol/OI history 7. Press the **bookmark** to save the contract to the Flow Tracker. ![The Contract Drilldown for an SPY call: flow bars through the day, net premium, and the contract's Vol / OI history.](https://www.skylit.ai/docs/images/guides/flowseeker/drilldown.light.webp) ### Company Events **Why it matters:** earnings, insider trades and Congress disclosures explain a lot of unusual flow. Check the calendar before you read size as a bet. **Where:** Flowseeker > Company Events. 1. With no ticker entered, the page opens on this week's earnings grid: who reports each day, before or after the bell. 2. Pick a day to see its expected moves, or a name to drill into it. 3. For one ticker, read **earnings, dividends and splits**, newest first, plus **insider activity** (Form 4 filings) and **Congress** disclosures when there are any. Use the search box in the insider section to find a name, role, action or security. ![Company Events with no ticker entered: this week's earnings grid, then the expected moves for the selected day.](https://www.skylit.ai/docs/images/guides/flowseeker/events.light.webp) How to read it: dates marked as estimated come from a data provider, not the company. Congress disclosures are filed weeks after the trade. They give a dollar range, not a share count, so read them as slow background, not a timing tool. ### Flow Tracker **Why it matters:** a big print only matters if the trader stays in. The Tracker follows the positions you care about and tells you whether they appear to still be open. **Where:** Flowseeker > Flow Tracker. 1. Save prints with **Track trade** (right-click a Live Feed row). They go to **Tracked Flow**. 2. Save contracts with the drilldown **bookmark** or from a Compass card. They go to **Tracked Contracts**, which shows each contract's current mid and spot. 3. In Tracked Flow, compare the saved print to the current mid and spot, its P/L, and its status: | Status | Meaning | | --- | --- | | **Still in** | No significant exit detected. | | **Pending** | A large opposite-side trade printed today; confirmed or retracted when open interest updates the next morning. | | **Partial** | Part of the position appears closed. | | **Exited** | Closes add up to the full size, or open interest collapsed. | | **Expired** | The contract has expired. | The status is inferred from the tape, not read from anyone's account. ### Flow Alerts **Why it matters:** you can't watch the tape all day. Alerts tell you when a print you care about shows up. **Where:** Flowseeker > Flow Alerts. 1. Press **New Alert**, give it an **Alert name** and pick the filters you want. The alert fires on each matching print as it arrives. 2. Set **Rate limit (max alerts / minute)** so a burst doesn't flood you. 3. Choose delivery (in-app, push, email, Discord DM) once, in **Notifications**. 4. Find your alerts on the **Alerts** tab. The **History** tab shows what fired. ![The New Alert form: alert name, tickers to include or exclude, side, trade side, and premium and size thresholds.](https://www.skylit.ai/docs/images/guides/flowseeker/alerts.light.webp) You can keep up to 25 alerts. ### Flow Summary and sharing **Why it matters:** if you share flow with a community, this builds an end-of-day digest without copying rows by hand. **Where:** Live Feed or Flow Scanner, on accounts with Flowseeker sharing. 1. Right-click a row and choose **Add to summary**. 2. Review the digest in the panel docked at the bottom right. It fetches current figures when you open it or press **Refresh**. A post sent after the close reports closing numbers. 3. Post it to the Discord channels you choose. Set up Discord channels and the digest's sections under Flowseeker > Settings > Discord. Accounts with API access also get an API Keys tab there. ## Use it with other Skylit tools **Why it matters:** flow tells you what is trading. Heatseeker tells you where dealers (the market makers on the other side of options trades) are positioned. Atlas puts both on the price chart. Together they show whether money is backing a level. The gamma terms below come from Heatseeker; its guide explains them. | Heatseeker shows | Flowseeker shows | How many traders read it (a habit, not a tested rule) | | --- | --- | --- | | Positive gamma floor under price | Put selling at or near that strike | The floor looks defended. | | Negative gamma below | Put buying and bearish Market Tide | The floor looks less protected. | **On Atlas** (plans that include charts): 1. Open the **Add** menu and choose **Flow** for call and put premium bars under the candles. 2. Set the Flow pane's own filters: - leg count (single, multi) and trade type (sweep, non-sweep) - moneyness (ITM, ATM, OTM) and trade side (bid, mid, ask) - DTE, premium and a minimum Flow Score 3. Optionally add a sweep call/put ratio line. 4. Add **Net Premium** for a pane with session-cumulative net call and net put premium. 5. Add **Flow VWAP** from the same menu. 6. Add **Dark Pool** to draw lines at the prices of the largest dark-pool prints. ## Ask Talon **Why it matters:** you can ask about flow in plain English instead of building filters. **Where:** Talon, on Pro and higher plans (see the Talon guide, "Who can use it"). Talon knows which page you are on. On most Flowseeker pages it sees your active filters and the rows in view: Live Feed, Flow Scanner, Contract Lookup, Company Events, Flow Tracker and Flow Compass. So "what am I looking at?" is answered from your screen. | You want | Ask Talon | | --- | --- | | Today's flow for a name | `/flow NVDA` · "What's the flow on AMD today?" | | Flow at one level | "Is the 230 strike on NVDA being bought or sold?" · "What's the flow at that wall?" | | Dark-pool prints | `/darkpool COIN` · "Any big dark pool prints on TSLA?" | | Unusual contracts market-wide | "What's unusual today?" · "Anything lighting up?" | | Contract boards over time | "Top premium contracts on META this month" | | Put/call and max pain | `/metrics SPY` | | The market | `/market` · "Where is premium going today?" | | Earnings, insiders, Congress | `/earnings AAPL` · "Any insider buying in PLTR?" · "Which names did members of Congress trade most this quarter?" | | This page | "Summarise this tab" · "Which of my tracked trades has the trader exited?" | How it behaves: - **`/flow` is single-leg.** It compares today with recent sessions. Direction comes from the buy/sell split, never from premium alone. - **Dark-pool reads cover about the last week** and cannot be widened; Talon declines longer windows. - **Contract boards reach back about a month.** Volume is summed over the window. Open interest is the last session's. - **Strike flow uses the expiry you name.** If you don't name one, Talon says which expiry it used. A strike outside the range it looked at is reported as missing, not as quiet. - **Talon quotes what traded.** It does not tell you to take a trade. ## Good to know - **Side is where a trade filled, not why.** Ask-side leans bought and bid-side leans sold, but a hedge, a close or one leg of a spread can print on either side. - **Much of the loudest flow is one leg of something else.** Not every spread can be detected. Check multi-leg and cross flags, and open the Contract Drilldown, before you read direction. - **Open interest updates overnight.** During the day, Vol/OI and Size > OI compare against yesterday's close. A print can look like a new position and turn out to be a close. The next morning's Delta OI settles it. - **Closing trades look bearish.** Bid-side size in a contract with large open interest is often someone closing, not a new bearish bet. - **Index puts are usually protection.** SPY and QQQ put buying is routine portfolio hedging. Several Compass cards leave indices out for this reason. - **Flow Score is a ranking, not a forecast.** It sorts prints by how directional they look. It has not been tested as a predictor of moves. - **Flow Tracker statuses are a best guess.** They are inferred from later trades and the next morning's open interest, not read from anyone's account. - **Stock-hedge pairings on crosses can be coincidence.** The closest pairings are solid. For looser ones, the badge says about one in six is coincidence. - **Crosses Only starts on 2026-08-17.** The filter covers trades from that date onward. - **Flow Compass cards describe today; they don't predict.** The Breadth Heat Calendar updates once a day. - **Dark-pool prints have no side.** They are not bullish or bearish on their own. - **Double-check some Talon answers.** For put/call and max pain, market summaries, unusual contracts, contract boards, company events, insiders and Congress, confirm Talon's answer on the matching Flowseeker page. - **Confirm earnings dates on Company Events** before relying on Talon's. - **Flowseeker shows what traded.** It is not a forecast and not a recommendation. ## What's new **September 2026** - **Net Impact tooltip now shows on hover.** Hovering a bar on the Net Impact card in Flow Compass now shows a tooltip with the ticker and its net call and put premium, following your cursor instead of staying hidden. See [Flow Compass](#flow-compass). - **Strike Flow bars show bought and sold only.** Strike Flow bars now show only bought and sold premium, with mid prints on hover, so each bar counts only trades with a clear side. See [Flow Compass](#flow-compass). - **1M window on Contract Lookup.** Contract Lookup boards now switch to 1M, so you can see which contracts led volume, premium and open interest over the past month. See [Contract Lookup and Contract Drilldown](#contract-lookup-and-contract-drilldown). - **Congress disclosures on Company Events.** Company Events now shows a ticker's trades disclosed by members of Congress, so you can spot that background before reading its flow. See [Company Events](#company-events). - **Insider activity on Company Events.** Company Events now lists a ticker's insider filings (Form 4) with a search box, so you can check insider trades in one place. See [Company Events](#company-events). - **Live Feed stays visible on reconnect.** Your Live Feed rows now stay on screen during a brief reconnect. The "Loading trades" overlay appears only when you change filters, sort or feed tab. See [Live Feed](#live-feed). - **Strike Flow: 1M and 3M windows and a QQQ card.** Strike Flow adds faster 1M and 3M windows for reading strikes near spot, and a second card opens on QQQ beside SPY. See [Flow Compass](#flow-compass). - **Flow VWAP for everyone on Atlas.** You can now add Flow VWAP on Atlas from the Add menu, next to the other flow panes, instead of the settings strip. See [Use it with other Skylit tools](#pairing-with-heatseeker-and-atlas). - **Flow Summary digest.** With Flowseeker sharing, right-click Live Feed or Flow Scanner rows and choose Add to summary to build an end-of-day digest for your Discord channels. See [Flow Summary and sharing](#flow-summary-and-sharing). - **Net Premium pane on Atlas.** Add Net Premium from the Atlas Add menu to see the session's cumulative net call and net put premium under your candles. See [Use it with other Skylit tools](#pairing-with-heatseeker-and-atlas). Every Flowseeker update: [skylit.ai/changelog/flowseeker](https://www.skylit.ai/changelog/flowseeker). ## Glossary | Term | Meaning | | --- | --- | | **0DTE** | An option that expires today. | | **Above ask / Below bid** | Printed outside the quoted spread: urgent buying or urgent selling. | | **Ask side / Bid side** | Printed at or near the ask (leans bought) or the bid (leans sold). | | **Bull/Bear** | A contract's split between bullish flow (calls bought, puts sold) and bearish flow (calls sold, puts bought). | | **Chain Bull/Bear** | The same split across the ticker's whole chain. | | **Contract Ratio** | A contract's bid/mid/ask mix. | | **Cross** | A trade whose two sides were matched before it printed. Its side does not signal aggression. | | **Dark pool print** | An off-exchange stock trade. No side, so no direction by itself. | | **Delta OI** | Change in open interest from one session to the next; confirms whether positions were opened. | | **DTE** | Days to expiration. 0 means it expires today. | | **Flow** | The stream of options trades (prints) as they happen. | | **Flow Score** | Directional score from -100 (bearish) to +100 (bullish). A ranking aid, not a forecast. | | **ITM / ATM / OTM** | In, at or out of the money: whether the strike is past, at or short of the stock price. | | **IV** | Implied volatility: how big a move the option's price assumes. | | **Market Tide** | The market's cumulative net call premium and net put premium through the session. | | **Mid** | Printed near the midpoint of the spread: neither clearly bought nor sold. | | **Multi-leg** | A print that is part of a spread or combo. | | **NCP / NPP** | Net call premium and net put premium. | | **Net Impact** | A ticker's NCP minus NPP for the day. | | **Open interest (OI)** | Contracts open at the prior close. | | **OTM / % OTM** | How far out of the money the strike is. | | **OPRA** | The body that publishes US options trades. | | **Print** | One reported trade. | | **Premium** | Dollars traded: price × size × 100. | | **Repetitive hits** | Several similar-size ask-side bursts in one contract over a week. | | **Side** | Where a print filled against the bid and ask. | | **Size > OI** | A single print larger than the contract's open interest. | | **Sweep** | An order filled across several exchanges at once. | | **Vol/OI** | Today's volume divided by open interest. | --- Source: https://www.skylit.ai/docs/guides/atlas # Atlas field guide > One live chart that shows where dealer positioning, options flow and dark-pool levels line up with price, so you can see your levels before price gets there. > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. Past behavior of any reading or setup does not guarantee future results. ## Why it matters Most charts show you price and leave the options market somewhere else. Atlas puts them together. It answers one question: **where do price, dealer positioning and real options activity line up right now?** Atlas is Skylit's own chart, inside the Skylit app. On one screen you get: | Layer | Comes from | What you see on the chart | | --- | --- | --- | | **Orbs** | Heatseeker | Circles at the strikes where dealer positioning is concentrated, bar by bar. Each of those strikes is a **node**. Bigger and brighter means stronger. The strongest is the **King Node**. | | **Heatmap and Trinity sidecars** | Heatseeker | Panels docked beside the chart (sidecars). Heatmap shows the strike-by-expiration heatmap for your symbol. Trinity shows several symbols' heatmaps side by side. | | **Flow** | Flowseeker | A pane of call premium (up) and put premium (down) for each candle. Click a bar to see the trades behind it. | | **Dark Pool** | Flowseeker | The largest recent dark-pool print levels as horizontal lines. | | **Price studies** | Atlas | VWAP, CVD, Volume, Volume Profile, TPO, Footprint and the usual moving averages, built from the trade tape. | | **Your things** | You | Price alerts, drawings, watchlists, saved layouts, and your positions if you trade on Nexus. | Atlas never calls a direction. An orb tells you how price tends to move through a level (slowed down or sped up), not which way it will go. The thesis is yours. > **Info:** **In plain English.** Dealers who take the other side of options trades hedge by buying and selling the underlying. Around some strikes that hedging leans against the move (buying dips, selling rips), so price tends to slow down there. Around others it leans with the move, so price tends to travel faster. The orbs mark where that hedging is concentrated. They say nothing about direction. ## Where to find it Atlas comes with the **Pro** plan. On other plans the page shows "Available to Pro Tier only". - **Open it:** in the left menu, pick **ATLAS**. It is also listed under **HEATSEEKER**, so the heatmap and the chart are one tap apart. The same entries are in the phone menu. - **Almost everything else is in Settings:** press **Shift+S**, or click the cog at the right end of the chart header. It holds the Exposure, Projection, indicator, sidecar and alert cards. ![Atlas Settings open beside the chart: Session, TZ, Layout, Interval and Candles, then the Exposure card and the Projection and Heatmap switches.](https://www.skylit.ai/docs/images/guides/atlas/settings.light.webp) | You want | Go to | | --- | --- | | Orb settings | Settings (Shift+S) > **Exposure** | | Add an indicator, Flow or Dark Pool | Settings > **Add** | | Heatmap or Trinity beside the chart | Settings > **Heatmap** / **Trinity**, or Shift+H / Shift+T | | Price alerts | Settings > **Alerts** (Shift+A), **Alert Lines** | | Saved workspaces | Layout switcher in the chart header, or `[` and `]` | | Past sessions | **Replay** (Shift+R) | | Every keyboard shortcut | Press `?` | | Product docs | skylit.ai/docs > Atlas (drawing presets, indicator pages) | | Price data by API | skylit.ai/docs > Atlas > API Reference (paid with Skylit API credits) | | Articles | skylit.ai/learn/reading-flow-on-atlas · skylit.ai/learn/reading-dark-pool-prints | | Report a bug or ask for a feature | app.skylit.ai/portal | ## Read it in 30 seconds 1. **Pick your horizon.** In Settings > Exposure, set **Expirations** to match how long you hold. Use **Front** for 0DTE (same-day expiry) and scalps. Use a wider window such as **To Friday** or **To OPEX** (the monthly options expiration) for swings. The orbs change with it. The price chart does not. 2. **Find the King Node and the nearest nodes above and below price.** Many traders treat these as the levels to watch (a rule of thumb, not a tested signal). Turn on **Node labels** to see each node's strike and its size as a percent of the king. 3. **Pick the exposure view.** **GEX** (gamma exposure) tracks how dealer hedging reacts to price. **VEX** (vanna exposure) tracks how it reacts to volatility. A common rule of thumb: GEX for intraday support and resistance, VEX for multi-day bias, **GEX+VEX** to see both. 4. **Look for confluence.** Confluence means several independent reasons at one price. Traders usually rate a node higher when it sits on a dark-pool level, a VWAP band or a cluster of flow bars. 5. **Watch what price does there.** The chart shows where the levels are. Price action shows what happens when price arrives. ## How to use it ### Set up the chart **Why:** the right symbol, timeframe and session make every other layer easier to read. **Where:** the header along the top of the chart, and the first cards in Settings (Shift+S). 1. Type a ticker in **symbol search** at the top left. You can chart stocks, ETFs, SPXW (the S&P 500 index options symbol) and futures continuous contracts such as ES1 and NQ1. With a watchlist open, the left and right arrow keys step through its symbols. 2. Pick an **interval**: 1m, 3m, 5m, 10m, 15m, 30m, 1H, 2H, 4H, 1D or 1W. You can also add your own, such as 7m or 90m. The strip shows your pinned set: right-click an interval to drop it, press **+** to add one back. 3. In Settings, pick a **Session**: **RTH** (regular trading hours only) or **ETH** (extended hours, including pre-market and after-hours). 4. Also in Settings, pick your timezone (**TZ**) and a **Candles** style (Classic, Mono, Neon, Ocean or White). ![An Atlas chart of TSLA on 3-minute candles, with dashed dark-pool levels across the candles.](https://www.skylit.ai/docs/images/guides/atlas/chart.light.webp) Also worth knowing: - **Fullscreen** (Shift+F) is in the header. - **Copy image** and **Save image** sit in each chart's own small button row, for sharing a chart. On a narrow chart they fold into a menu there. > **Tip:** **Narrow window.** Many controls live off to the right of the header. On a narrow window, scroll the header sideways to find Replay and the rest, or press `?` for the full shortcut list. ### Panes and layouts **Why:** watch several symbols or timeframes at once, and come back to the same workspace every day. **Where:** **Pane layout** and the layout switcher in the chart header. 1. Open **Pane layout** and pick an arrangement: Single, 2-Up, 2-Stack, 3-Up, 1 + 2, 4-Grid and more, up to five panes. Phones use the stacked arrangements. 2. Click a pane to focus it, then set its symbol and interval. 3. In the same **Pane layout** menu, the **Sync** row decides how changes spread. With **Settings** on, a settings change applies to every pane; off, only to the focused pane. **Interval**, **Crosshair**, **Time** and **Price** link the interval, the crosshair time, the visible time window and the price-axis scale across panes. ![The Pane layout menu: Single, 2-Up, 2-Stack, 3-Up, 3-Stack, 1 + 2, 1 | 2, 4-Grid, 4-Up and 4-Stack.](https://www.skylit.ai/docs/images/guides/atlas/pane-layout.light.webp) **Layouts** save the whole workspace: the arrangement, each pane's symbol, interval and overlays, and which sidecars are open. There is no Save button. Changes save a moment after you make them. Layouts belong to your account and follow you to other devices. Press `[` and `]` to cycle through them. You can also export a layout to a file and import it. ### Dealer positioning: the orbs **Why:** see the strikes where dealer hedging is heaviest, drawn right where price is. That shows where a move may slow down or speed up. **Where:** Settings (Shift+S) > **Exposure**. 1. Choose **GEX**, **VEX** or **GEX+VEX** (or press Shift+G, Shift+V, Shift+C). 2. Set **Expirations** to your holding period. 3. Set **Nodes** to control how many strikes are drawn per candle. 4. Turn on **Node labels** if you want the strike and size printed next to the strongest nodes. ![Orbs on an AMZN chart: each strike's dealer exposure drawn on the candles, the biggest and brightest at the strongest node.](https://www.skylit.ai/docs/images/guides/atlas/orbs.light.webp) > **Info:** **In plain English.** GEX (gamma exposure) is about price: how much dealer hedging shifts as the underlying moves, which is why traders read it for intraday support and resistance. VEX (vanna exposure) is about volatility: how much that hedging shifts when implied volatility rises or falls, even if price sits still. A quiet stretch after an event like CPI can move dealer hedges without SPY moving at all. That slower pressure is why traders look at VEX for multi-day bias. What each control does: | Control | What it does | | --- | --- | | **GEX / VEX / GEX+VEX** | Which exposure the orbs draw. | | **Derived** | Also draw exposure borrowed from related products: the S&P chains (SPY, SPXW, SPX) on ES and on each other, the Nasdaq chains (QQQ, NDXP, NDX) on NQ and on each other, and GLD, SLV, DIA and IWM on gold, silver, Dow and Russell futures. The **Derived** button also sits in the chart header next to GEX and VEX. With **Distinct derived shapes** on (the default), derived orbs draw as a diamond and triangles so you can tell them apart. **Derived at latest ratio** holds each derived strike on one horizontal line instead of letting it drift with the small price gap between the two products. | | **Expirations** | Which expirations feed the orbs: **Front** (the nearest expiry), **To Friday**, **To Next Friday**, **To OPEX**, **To Next OPEX**, **To Q-OPEX**, **To Next Q-OPEX**, **All**, or an exact count of expirations (2, 3, 5, 7, 10, 15, 20, 30 or 50, front included). Hover an option to see what it covers and the date it ends on. | | **Nodes** | How many strikes are drawn per candle: a fixed count (1, 3, 5, 10, 15 or 20), or a P-value (P15 to P60) that keeps every strike at least that percent of the King Node. | | **Color** | Default, Warm, Cool or Mono. **Match heatmap palette** colors orbs exactly like the heatmap cells. | | **Orb size, clamps, opacities** | How big and how bright orbs get, including a separate **King Opacity** so the King Node stands out. | | **Node labels** | Label the strongest live nodes with strike and size as a percent of the king, pinned left, right, or just after the newest candle. With only GEX or only VEX selected, the strongest node shows its dollar exposure instead. | | **Realtime values** | Keep orb sizes and labels updating live (Front expiration only, not with GEX+VEX). | | **Scroll as replay** | When you scroll back, past orbs are sized only by what was known at that time, not by later bars. On by default. | **How to read it:** - **Size and brightness:** bigger, brighter orbs are stronger nodes. The King Node is the strongest on the board for your Expirations setting. - **Color (Default palette):** yellow orbs are positive exposure and purple orbs are negative (with GEX+VEX, gold and orange). Strength shows in size and brightness, not in a different color. With **Match heatmap palette** on, orbs take the heatmap's color scale instead. - **Positive is not bullish.** Around positive nodes price tends to slow down. Around negative nodes it tends to move faster. Either kind can act as support or resistance. - Changing these settings changes which data is drawn, never the data itself. ### Projection **Why:** see where positioning sits past the last candle, so you can plan around levels that are coming up. **Where:** Settings (Shift+S) > **Projection**. 1. Switch **Projection** on. 2. It follows your chart interval on its own: short on intraday charts, farther out on higher timeframes. **How to read it:** Projection draws exposure zones ahead of price. It is a positioning scenario, not a probability forecast. Read it as "where the positioning sits ahead", not "where price will be". ### Indicators **Why:** add options flow, dark-pool levels and volume studies to the same chart, so you can check whether they agree with a node. **Where:** Settings (Shift+S) > the **Add** card below the indicator rows. 1. Open Settings and press **Add**. 2. Pick an indicator. It gets its own row in Settings with a cog for its options. 3. Most indicators can be added more than once with different settings (for example two VWAPs with different anchors). | Indicator | What it shows | | --- | --- | | **Flow** | Call premium above zero, put premium below, per candle. Filters: Leg Count (Single, Multi), Trade Type (Sweep, Non-Sweep), Moneyness (ITM, ATM, OTM), Trade Side (Bid, Mid, Ask), DTE, Flow Score and premium bounds. Click a bar to open the **Flow Bucket**: time range, trade count, net flow, calls vs puts, bucket and day put/call, and top contracts. | | **Dark Pool** | The top dark-pool print levels over a lookback (defaults: top 3 over 45 days), labelled always or on hover. | | **VWAP** | Volume-weighted average price, anchored to the session, week, month, quarter or year (or, on a stock, to an earnings, dividend or split date), with up to three bands. | | **GEX VWAP / VEX VWAP** | Where the option board's exposure is centred, as a line with an optional band. Not a volume VWAP. | | **Flow VWAP**, **Net Premium** | Flow-based companions to the Flow pane. Net Premium draws two running lines for the session: net call premium and net put premium. | | **Volume**, **CVD**, **Candle Delta**, **Footprint** | Traded volume split into buys and sells from the tape. CVD (cumulative volume delta) is the running buy-minus-sell total. | | **Volume Profile**, **TPO** | Volume at each price and time at each price, with Point of Control (the busiest price) and Value Area. | | **Session Levels**, **Session Zones** | Prior-day, premarket, Asia, London, initial-balance, week and month highs and lows plus key opens. Session Zones shades each part of the session. | | **EMA, SMA, Bollinger** | The usual moving averages and bands. | > **Note:** **SPXW volume.** SPXW has no traded volume of its own, so volume-based studies on it use ES futures volume. skylit.ai/docs has a full page for GEX VWAP, VWAP, CVD, Volume Profile and TPO. ### Sidecars **Why:** keep the full heatmap, other markets, your watchlist and your alerts in view without leaving the chart. **Where:** Settings (Shift+S). Each sidecar has a switch and a dock side (left or right). - **Heatmap** (Shift+H): the Heatseeker heatmap for the symbol you are charting, synced to the focused pane. Its cog sets velocity, dock side and header. A symbol with no option chain of its own (ES, NQ) shows a derived board, mapped from a related product. - **Trinity** (Shift+T): up to 10 heatmaps side by side, one per symbol (SPXW, SPY and QQQ by default), saved with the layout. When a panel maps onto your chart, press the **Spot** pill in the Trinity header to show that panel in the chart's prices, so SPY strikes read as ES prices on an ES chart. - **Watchlist**: your lists with live quotes, a Favorites section and columns you can choose. - **Alerts** (Shift+A): every price alert you have, across symbols. Click a row to jump to that symbol. The dot switches the alert on or off. ![The Heatmap sidecar docked to the right of an SPY chart.](https://www.skylit.ai/docs/images/guides/atlas/heatmap-sidecar.light.webp) ### Price alerts **Why:** get told when price reaches a level, instead of watching the screen. **Where:** on the chart, or from a node in the Heatmap or Trinity sidecar. Manage them in the **Alerts** sidecar (Shift+A). 1. Right-click the chart at the price you want and pick **Add price alert here**. To alert on a node instead, pick **Alert on nearest node**. You can also set one from a node in the Heatmap or Trinity sidecar. 2. In the **Create alert** box, check the level and pick a **Trigger**: **Once** turns the alert off after it fires, **Repeat** keeps it on (with a short wait between alerts). 3. An alert set from a node can either watch that exact price or follow the node if it moves to another strike. Pick the one you want. 4. Turn on **Alert Lines** to draw this symbol's alerts as horizontal lines. Drag a line to move the alert to a new price. The cog styles the lines. ![Right-clicking the chart offers Add price alert here and Alert on nearest node.](https://www.skylit.ai/docs/images/guides/atlas/price-alert.light.webp) An alert fires as soon as price touches the level. ### Drawings **Why:** mark your own levels, trends and trade plans on the chart. **Where:** the drawing rail. Open it with the pencil icon in the chart header. 1. Open the drawing rail and pick a tool, or use a shortcut from the table below. 2. Click on the chart to place it. ![The drawing rail open on the left edge of the chart.](https://www.skylit.ai/docs/images/guides/atlas/drawing-rail.light.webp) | Tool | Shortcut | | --- | --- | | Trendline | Alt+T | | Horizontal line / ray | Alt+H / Alt+J | | Vertical line | Alt+V | | Rectangle | Alt+Shift+R | | Arrow, brush, text | Alt+A, Alt+B, Alt+X | | Fibonacci | Alt+F | | Long / short position | Alt+L / Alt+S | | Magnet (snap to a candle's open, high, low or close) | Alt+M | | Select | Alt+P | **Drawing presets** save a Fibonacci or line style under a name. Star one to make it the default for new drawings of that type. Presets sync to your account (up to 50 across all tools). Press `?` to see every shortcut. ### Replay **Why:** review a past session, or practise reading a chart without knowing what happens next. **Where:** **Replay** in the chart header, or Shift+R. 1. Press **Replay** (Shift+R). 2. Use **Select start** and click the candle you want to start from, or press **Random** to drop in at a random minute. 3. Press play. The session runs candle by candle, with the orbs, flow and overlays as they were at that minute. In a layout with several panes, Replay runs every pane from the focused symbol's timeline. Replay is for review and practice. A setup that worked in Replay is one example, not a tested edge. ### Plugins **Why:** extra overlays for specific setups. **Where:** each plugin is a row in Settings and a group in the **Add** menu. Which ones you see depends on your plan. - **The Quiet Calf** is a paid plugin: gap-fill, True Day Open, opening-range, range-expansion and prior-day high/low levels, plus **Std Legs** (an analyst's standard-deviation ranges). Its row shows a grey **Paid** tag if your plan does not include it. It is not on sale yet. ### Trade from the chart **Why:** see your positions where price is, and act on them without switching screens. **Where:** the **Trade Deck** and **Traders** rows in Settings. Needs a Nexus account. - **Trade Deck:** your Nexus paper positions drawn on the chart, with one-tap paper trading. Its cog chooses whose positions to show. - **Traders:** positions of traders you follow on Nexus, on this chart. The row appears once Trade Deck is set to include followed traders and one of them holds this symbol. ### Common routines These are rules of thumb traders use, collected from experienced traders and member Q&A. None of them is a tested signal. #### Scalping and 0DTE Settings that suit short holds - Expirations **Front**, Nodes 3, 5 or 10 per candle, **GEX** view. - 3-minute candles for fine detail. 5 or 10 minutes when you also watch heatmap velocity (how fast each node is growing or shrinking). - Many scalpers look for reactions at nodes rather than breakouts: price reaches a node, and the question is whether it bounces off. They define risk just past the level. #### Swings Settings that suit multi-day holds - Expirations one step wider than Front (To Friday or an exact count of 2), and look at **VEX** as well as GEX. - Mark levels on 1H to 1D; use the lower intervals to watch how price behaves when it gets there. - Match your Expirations and Nodes settings to your timeframe. Going from 5 to 10 nodes changes the picture a lot. #### Confluence Stacking independent reasons at one price - A dark-pool level that lines up with a King Node is the classic confluence traders look for. - Flow into negative-gamma strikes above price can speed a move up. The same flow into a strong positive node tends to stall there (from the "Reading Flow on Atlas" article). - Many traders rotate through the Flow filters rather than hunting for one "best" setting. Activity that shows up under several filters, on a node, is the kind they mark. #### Using Replay to learn Practice on past sessions - Use **Random** start and call the next level before you press play. - Replay a day with **Scroll as replay** on, so the orbs you study are the ones you would have seen live. > **Note:** **Rule of thumb.** Atlas tells you where the levels are. What price does at the level is the part you judge yourself. ## Use it with other Skylit tools | Tool | How it pairs with Atlas | | --- | --- | | **Heatseeker** | The source of the orbs. Use the full heatmap to see the whole board and velocity; use Atlas to see how price behaves at those strikes. Atlas is listed in the Heatseeker menu too. | | **Flowseeker** | The source of the Flow pane and Dark Pool levels. Find a print in Flowseeker, then check on Atlas whether it landed at a node. | | **Nexus** | Trade Deck and Traders put your Nexus positions, and those of traders you follow, on the chart. | | **Talon** | Ask about the chart you are looking at. See below. | ## Ask Talon **Why:** get a plain-language read of the chart you are already looking at, using the same numbers you see. **Where:** Talon, on the Pro plan (see the Talon guide, "Who can use it"). Talon knows what is on your Atlas screen: the symbol, the interval, every pane in a multi-chart layout, whether you are viewing GEX, VEX or both, and which sidecars are open. When the Heatmap or Trinity sidecar is open, it also reads the positioning those panels show. | You want | Ask Talon | | --- | --- | | A read of the charted symbol | "What's the read on this?" · "Where are SPY's levels for the week?" | | One level | "Where's the king on TSLA?" · "Which way is AMD's skew?" | | Context for a name | "/flow AAPL" · "/darkpool META" · "/earnings GOOGL" | | A scan of your own Atlas list | "/watchlist Favorites" (Talon scans the lists you keep in Atlas) | How it behaves: - **One symbol's read at a time.** In a layout with several panes, the read covers the focused pane. Ask about another symbol by name and Talon looks it up separately. - **Open a sidecar for the fullest answer.** Without the Heatmap or Trinity sidecar open, Talon still knows the chart but has no on-screen positioning to quote, so it looks it up instead. - **"Mark these on the chart" is not offered on the Atlas page.** That button draws Talon's levels on the Talon canvas chart instead. - Talon does not place, size or recommend trades. ## Good to know - **Atlas is not a forecast.** It shows positioning, flow and price together. It does not call direction and it is not a recommendation. - **Compare Atlas and the heatmap on the same setting.** They use the same positioning data in different views. If the orbs and the heatmap disagree, the two are almost always set to different expirations. Set Expirations to **Front** to compare like for like. - **Check SPX price against another source.** Some members have seen a gap between the SPX price on Atlas and on the SPX heatmap. If you work SPX levels to the point, confirm the price elsewhere. - **Derived levels move a little.** On ES, NQ and SPXW, some levels are mapped from a related product. They drift slightly during the day as the two prices move apart (people call it "the wiggle"). A level that briefly disappears was hidden, not drawn in the wrong place. - **Projection and Replay are for planning and practice.** Projection is a scenario, not a prediction. Replay and **Scroll as replay** are built to show only what was known at the time, and one good replay is one example, not proof. - **Routines are rules of thumb.** The routines in this guide come from traders' experience, not from tested results. - **Heavy layouts can lag.** Several panes, sidecars and many indicators can slow the chart on phones and on Chrome for Windows. ### If something looks wrong | You see | Do this | | --- | --- | | Orbs purple where the heatmap shows positive | Set Expirations to **Front** so Atlas matches the heatmap and Trinity. | | A gap between SPX on Atlas and the SPX heatmap | Confirm the price against another source. Also check whether you are looking at a board derived from SPY. | | Derived levels move a little on ES or NQ | Expected ("the wiggle"): they stay lined up with live price. To hold each strike on one line, turn on **Derived at latest ratio** in the Exposure cog. | | A plugin row is grey with a "Paid" tag | It is a paid plugin your plan does not include. | | Chart not updating | Hard refresh. Check the trade date is today and you are on the interval you expect. | | Chart slow | Close sidecars and panes you are not using. Heavy layouts are costly on phones and on Chrome for Windows. | | Cannot find Replay | Scroll the header to the right on a narrow window, or press Shift+R. | ## What's new **September 2026** - **Quick BUY and SELL buttons on the chart.** Futures charts now show SELL, size and BUY buttons in the top row so you can place a market order without opening the ticket. They use your ticket's price and size, and are disabled, with a reason, when an order can't be placed. See [Trade from the chart](#trade-from-the-chart). - **Plugin toggles stay separate across tabs.** Turning a plugin on or off in one Atlas tab no longer changes it in another tab open on a different layout. Each tab now keeps its own plugin settings. See [Plugins](#plugins). - **P10 in the Nodes dropdown.** The chart's Nodes dropdown, and the Sniper lines list in Trinity, now include a P10 option alongside the existing choices. See [Dealer positioning: the orbs](#dealer-positioning-the-orbs). - **Leaving Atlas from the menu.** Picking another page in the menu while on Atlas, such as Heatmaps, now opens it on the first click, with no flicker back. See [Where to find it](#where-everything-lives). - **Atlas in the Heatseeker menu.** Atlas now also appears under HEATSEEKER, on desktop and phone, so you can jump between the heatmap and the chart in one tap. See [Where to find it](#where-everything-lives). - **Talon canvas uses your chart settings.** The Talon canvas chart now opens with your Atlas colors, candles, Dark Pool settings and interval, so it looks like the chart you know. See [Ask Talon](#talon). - **Custom chart intervals.** You can add your own minute or hour intervals, such as 7m or 90m. They save with your pane and layout for next time. See [Set up the chart](#set-up-the-chart). - **Trinity sidecar stays centred.** After you zoom the browser or resize the window, the Trinity sidecar now re-centres on the spot row instead of drifting off to one side. See [Sidecars](#sidecars). - **Flow VWAP for everyone.** Flow VWAP is now open to every Atlas member. You add it from the Add card in Settings, alongside the other indicators. See [Indicators](#indicators). - **Net Premium pane.** Net Premium draws running net call and net put premium lines for the session, so you see which side options money is building on. See [Indicators](#indicators). - **Flow bar selection at the live edge.** When you click the newest Flow bar, or end a range on it, the outline marking the Flow Bucket's bars now stays visible. See [Indicators](#indicators). Every Atlas update: [skylit.ai/changelog/atlas](https://www.skylit.ai/changelog/atlas). ## Glossary | Term | Meaning | | --- | --- | | **Orb** | A circle on the chart marking a Heatseeker node at its strike, bar by bar. Bigger and brighter means stronger. | | **Node** | A strike where dealer positioning is concentrated. Yellow orbs are positive, purple negative (Default colors). | | **King Node** | The strongest node on the board for the selected expirations. Other nodes' sizes are shown as a percentage of it. | | **GEX** | Gamma exposure: dealer positioning that matters most for short-term support and resistance. | | **VEX** | Vanna exposure: positioning traders lean on for multi-day bias and when volatility moves. | | **Derived** | Exposure borrowed from a related product and mapped onto this chart's prices, such as SPY levels on ES. | | **Wiggle** | The small drift of derived levels during the session as the two products' prices move slightly apart. | | **Front** | The nearest expiration. | | **Velocity** | How fast a node's exposure is growing or shrinking. Shown on the Heatseeker heatmap. | | **0DTE** | Options that expire today. | | **OPEX** | The monthly options expiration (third Friday). **Q-OPEX** is the quarterly one. | | **Confluence** | Several independent reasons (a node, a dark-pool level, VWAP, flow) at one price. | | **P-value (Nodes)** | A Nodes setting (P15 to P60) that keeps every strike at least that percent of the King Node's size. | | **Sidecar** | A panel docked beside the chart: Heatmap, Trinity, Watchlist, Alerts. | | **Trinity** | Several heatmaps side by side (by default SPXW, SPY and QQQ) for cross-market context. | | **Flow Bucket** | The detail view behind one Flow bar: its trades, net flow, put/call and top contracts. | | **Replay** | Playing a past session back with the data as it was at each minute. | | **Scroll as replay** | Sizing past orbs only by what was known at the time as you scroll back. | | **Projection** | Exposure zones drawn past the last candle. A scenario, not a forecast. | | **Layout** | A saved workspace: panes, symbols, intervals, overlays and sidecars. | | **Pane sync** | The **Sync** row in the Pane layout menu: whether a change applies to all panes or only the focused one. | | **RTH / ETH** | Regular trading hours; extended hours (pre-market and after-hours included). | --- Source: https://www.skylit.ai/docs/guides/nexus # Nexus field guide > Practice options trades in your own $100,000 paper wallet, see exactly how each trade went, and compare your record with other traders. > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. Past behavior of any reading or setup does not guarantee future results. > **Note:** **What this guide covers.** This guide covers the **NEXUS** section of the Skylit sidebar: Leaderboard, My Profile, Trades, Ideas, New Trade and Settings. ## Why it matters Most traders don't know their own numbers. Nexus shows you **how you actually trade, and how that compares with everyone else**, without risking real money. It does four jobs for you: - **A paper wallet for options.** You get one practice wallet that starts at \$100,000. Open paper positions in calls and puts from a live options chain, then add to, trim or close them. The wallet is yours for good and carries over from season to season. Seasons change the leaderboard, never your balance. - **A record of every trade.** Each trade is kept as a card with its entries, trims, exit, profit or loss (P&L) and how far it ran for or against you. - **A community board.** The leaderboard ranks traders over the current season (an **Arc**), a week, a month or all time. There is also a board of Discord servers (**Guilds**). You can follow traders and see their trades in your feed and on your Atlas chart. - **An ideas feed.** Post a short bullish or bearish view on a ticker. Nexus tracks the price from the moment you post it. The first time you open Nexus, you accept a short disclaimer. Nexus is an educational beta for reviewing your own trading. It is not financial advice, and it is **not meant for copying anyone's positions**. Keep that in mind when you use the social features. ## Where to find it Open the left sidebar and scroll to **NEXUS**. It is there for every signed-in member. | You want to | Go to | | --- | --- | | Place a paper options trade | Nexus > **New Trade** (or **New Trade** at the top of Trades) | | Add to, trim or close an open trade | Nexus > **Trades** > **My Trades**, then open the card | | See your wallet balance and return | Nexus > **My Profile**, wallet panel | | See rankings, Arcs and guilds | Nexus > **Leaderboard** | | Share your profile | Type `/nexus/u/` after the Skylit address and share that link | | Post a trade idea | Nexus > **Ideas** | | Post trades to Discord | Nexus > **Settings** > **Discord** and **Routing** | | See your positions on a chart | Atlas > **Trade Deck** (on plans that include Atlas) | ## Read it in 30 seconds 1. **Wallet first.** My Profile shows your paper equity, cash, realized P&L and return, and how many practice trades are open. 2. **Open trades next.** Trades > My Trades > Active. Each card shows live P&L, the best the trade has been (**Apex Return**) and the worst (**Max Drawdown**). 3. **Then your record.** The **Closed** tab on My Profile lists finished trades, and the stats radar sums them up: win rate, average return, worst loss. 4. **Then the board.** The Leaderboard opens on the current Arc. Your rank tier (Theta up to Oracle) shows only after **10 closed trades**. Until then you are Unranked, even if your row is on the board. ## How to use it ### Place a paper trade: New Trade **Why it matters:** you can try a trade idea with realistic fills and see what it does to your wallet before you commit anything. **Where:** Nexus > **New Trade**. It opens on the last symbol you charted, or TSLA if there isn't one. If you come from a futures chart (NQ, ES), it switches to the matching index ETF, because futures have no options chain here. 1. Check the ticker at the top. Type a new one to switch. Next to the price is the quote status: **Live** (streaming), **Snapshot** (the last quote is too old to count as live), **Closed** or **Waiting**. 2. Pick an expiration from the row of **expiration pills**. 3. Choose a contract. **Contract preference** picks a starting contract for you: - **~30Δ**: the contract with a delta closest to 0.30. - **\$2-4**: a contract whose ask is between \$2 and \$4. - **Liquid**: the one with the most open interest plus volume. Tap any strike in the options chain to pick a different one. 4. Set the quantity. The order panel shows the estimated cost (price x quantity x 100). The **Simulated Buying Power** panel shows **Available Cash**, **Starting Bankroll**, **Realized P&L** and **After This Order**, so you see what the trade does to your wallet first. 5. On a phone, add optional **Notes** (the box reads "Trade thesis..."): a note that stays with the trade. 6. Place the order with **Execute Trade** (desktop) or **Log as Simulated** (phone). ![New Trade for SPY: the expiration pills, then the options chain with calls on the left, strikes in the middle and puts on the right.](https://www.skylit.ai/docs/images/guides/nexus/new-trade.light.webp) > **Info:** **In plain English.** Delta is roughly how much the option's price moves for a \$1 move in the stock. A 0.30-delta call gains about 30 cents a share (about \$30 a contract) if the stock rises \$1, before time decay and volatility change it. On the same expiration, lower-delta contracts sit further out of the money and cost less. **Reading the chain.** Calls sit on the left, strikes in the middle and puts on the right, always side by side. Use the column picker to choose the columns (Bid, Ask, Last, Mid, Delta, Gamma, Theta, Vega, IV, Volume, Open Int). It also sets the **Strike Order**: **High → Low** or **Low → High**. **How your order fills.** Orders are market orders. A buy fills at the **ask** and a sale at the **bid**, like a real market order. > **Info:** **In plain English.** Every contract has two prices: the bid (the best price buyers are offering) and the ask (the best price sellers will take). Say a TSLA call is quoted 2.00 / 2.20. You pay \$220 for one contract, and if you closed it straight away you would get \$200 back. That \$20 is the spread, and you pay it before the stock has moved at all. Orders go through only while that contract is trading. Outside those hours the button says why and when the market reopens. Expired contracts can't be traded. ### Manage your trades: Trades **Why it matters:** the card shows you how a trade really played out, including the gain you left behind, so you can review exits as well as entries. **Where:** Nexus > **Trades**. The tabs are **All**, **Following**, **My Trades** and **Bookmarked**. To add to, trim or close one of your open trades: 1. Go to **My Trades** and set the filter to **Active**. 2. Open the trade card. 3. Tap **Add**, **Trim** or **Close**. 4. Set the quantity in the panel and confirm. Adds fill at the ask; trims and closes fill at the bid. > **Tip:** **Leave the price on market.** The panel shows the live Bid, Mark and Ask. Tapping one of them switches to a manual fill price, which isn't accepted. Leave it on the market price. **Filters.** Choose **Verified Only** or **Simulated Only**, **Active** or **Closed**, and sort by **Newest**, **Oldest** or **Biggest Move**. **Reading a trade card.** Each card shows the contract, a **Simulated** or **Verified** badge, the trader's rank tier and P&L. Open it to see: - the **timeline**: Opened Position, Averaged Down, Partial Exit and the exit, each with its price and time; - live **Bid / Mark / Ask** and greeks for an open trade; - the **excursion figures**. Open trades show Realized P/L, Apex Return, Max Drawdown and Trade Duration. Closed trades show Realized P/L, Absolute Apex, Missed Upside, Apex Giveback, Max Drawdown and Trade Duration; - reactions, comments and a bookmark. ![A trade card opened for details: the P/L path from open to exit, the trade lifecycle, and the position summary.](https://www.skylit.ai/docs/images/guides/nexus/trade-card.light.webp) Contracts still open at expiration close by themselves and show as **Auto-Expired**. > **Info:** **In plain English.** The excursion figures are a trade's high- and low-water marks. **Apex Return** is the best the trade got, **Max Drawdown** the worst. After you close, **Missed Upside** is how much further the contract ran without you. **Apex Giveback** is how much of the peak you handed back before you got out. ### Your profile and wallet: My Profile **Why it matters:** one page tells you where your practice account stands and what kind of trader your record says you are. **Where:** Nexus > **My Profile**. 1. Read the **wallet panel**: Season Equity (cash plus the estimated value of open positions), Cash Balance, Realized P&L, Season Return, the starting amount and **Resets This Season**. 2. Check the **stats radar**: Total Trades, Risk Reward, Worst Loss, Win Rate, Avg Return. A dash means *not measured yet*, not zero. Worst Loss is your single worst closing return, not an account drawdown. 3. Use the tabs: **Active**, **Closed**, and **Coach** (on your own profile only). ![My Profile: the wallet panel across the top, the Active, Closed and Coach tabs, and the stats radar.](https://www.skylit.ai/docs/images/guides/nexus/profile.light.webp) The top of the profile shows your **rank tier**, **Cred** (your Nexus reputation score), streak, followers and your primary guild. **The Coach tab.** Coach reviews your own closed trades and points out habits, such as how long you hold, which expirations you favour and how far from the price you pick strikes. - Until you have enough closed trades, it shows a progress bar: "You're at X / Y closed trades". - After that it shows insight cards, refreshed overnight. Each has a label (Info, Opportunity, Warning or Critical) and a **Save** button. **Your username.** If your account has no username, Nexus asks you to choose one: 3-20 letters, digits or underscores. Other people can't search for or follow an account with no handle. **Sharing your profile.** Your profile has its own address, `/nexus/u/`, that you can paste anywhere. The Share icon in the profile header doesn't do anything yet, so copy the address by hand. ### Rankings: Leaderboard **Why it matters:** it shows how your record stacks up, and lets you study how other traders manage their trades. **Where:** Nexus > **Leaderboard**. 1. Pick a board: **Individual** or **Guilds**. 2. Pick a timeframe: **Season** (the default), **Month**, **Week** or **All-Time**. In Season view the header shows the Arc's name and how many days are left. 3. Sort by clicking a column: Trader, Win Rate, Avg Return, Streak, Total Trades or Active. 4. Turn on **Verified** to keep only traders with broker-verified trades, or use **Search traders** to find anyone by handle. ![The Leaderboard on the Season view with the top three on the podium. Other members' names and pictures are blurred here.](https://www.skylit.ai/docs/images/guides/nexus/leaderboard.light.webp) **Following a trader.** Hover a trader's name for a quick card, or click the row to open their profile card (**View Full Profile** opens the whole page). Then click **Follow** (click again to unfollow). Their trades show up under Trades > **Following**, and their ideas under Ideas > **Following**. **Reading the board.** The columns are #, Tier, Trader, Specialty (Options / Stocks / Futures, Day / Swing), Win Rate, Avg Return, Streak, Total Trades and Active. Only traders with 10 or more closed trades in the timeframe get a number in the # column (the rest show a dash), and the number follows the column you sorted by. In Week or Month view, a win rate of zero next to a flat average return usually means the trader closed nothing in that timeframe, not that every trade lost. Total Trades is not limited to the timeframe, so check it before reading much into a row. Rank tiers, top to bottom: **Oracle, Omega, Ultima, Gamma, Delta, Theta**, then **Unranked** for anyone under 10 closed trades. **Arcs** are seasons, one calendar quarter each (Eastern time): Arc 1 *Genesis* (Jan-Mar), Arc 2 *Ascension* (Apr-Jun), Arc 3 *Convergence* (Jul-Sep), Arc 4 *Apex* (Oct-Dec). When an Arc ends, its final standings are saved as the season record. Your wallet carries straight on. ### Share a view: Ideas **Why it matters:** writing your view down before the move keeps you honest, and the feed shows how each idea has played out since. **Where:** Nexus > **Ideas**. 1. Pick a feed: **Latest**, **Trending** or **Following**. 2. Filter by **Bullish** or **Bearish**, and sort by Newest, Oldest or Biggest Move. Search covers ideas, tickers and users. 3. To post, click **Share Idea** at the top of the page. Enter a ticker, pick bullish or bearish, and write your thesis. You can use `@mentions` and `$cashtags`, and add images and links. Each idea shows the **price when posted** next to the **current price**. Ideas are separate from trades: they don't count toward your win rate or P&L. ### Post to Discord: Settings **Why it matters:** your trades and ideas can post to your community's Discord channels without copy and paste. **Where:** Nexus > **Settings**. The tabs are **Discord**, **Routing**, **Notifications** and **Integrations**. 1. On **Discord**, check your servers and their setup status, and set your **primary guild**: the server your trades go to when you post from Skylit. **Mute All Discord Routing** turns all posting off at once. If Nexus confirms you own or run a server, you can also pick its guild roster here (up to five members for the season). 2. On **Routing**, add rules that decide which trades and ideas post to which channels. Rules can match on content type, call/put or bullish/bearish, options or stocks, simulated or verified, tickers, P&L, rank and time window. 3. Place a trade. If no channel received it, Nexus tells you. **Notifications** and **Integrations** say "coming soon". Broker, SMS and social connections are not available yet. ## Use it with other Skylit tools | Tool | How it works with Nexus | | --- | --- | | **Atlas** | Turn on **Trade Deck** to see your Nexus positions pinned to the chart where you opened them. You can also trade your own positions from there with one tap. Its settings switch between your positions (**Mine**), the traders you follow (**Following**), or **Both**. Hover a position to see its adds and trims. | | **Heatseeker** | Plan a trade off Heatseeker levels, then log it in Nexus. Your trade cards and profile stats show how those trades went *for you*. | | **Live Stages** | Hover a username in a Stage to see that person's Nexus card. | | **Discord** | Routing rules post your trades and ideas to the channels you choose. | ## Ask Talon Talon **can't read your Nexus data yet**: not your trades, wallet or leaderboard position. It does know which Nexus page you are on. It can help with general "how do I" questions, but its Nexus answers are still thin. For your own numbers, use My Profile and your trade cards. ## Good to know - **Every trade is a paper trade.** Connecting a broker isn't available yet, so the **Verified** badge, filter and leaderboard switch stay empty for now. - **"Season Equity" and "Season Return" cover your whole wallet history**, not just the current Arc. Read them as all-time numbers. - **The profile Share icon doesn't work yet.** Share your `/nexus/u/` address instead. - **Leave fills on the market price.** When you add, trim or close, tapping Bid, Mark or Ask switches to a manual price. Orders at a manual price are turned down. - **Expired options don't show under Closed.** On Trades, the **Closed** filter leaves out contracts that expired while open (the Auto-Expired ones). Set the status filter to **All Statuses** to see them. The **Closed** tab on My Profile does include them. - **Rank tiers need 10 closed trades.** Until then you show as Unranked. - **A dash is not a zero.** On your profile, a dash means nothing has been measured yet. - **A zero row on the leaderboard may be an empty one.** In Week or Month view, a trader who closed nothing in that timeframe shows a zero win rate and a flat average return. - **Small samples are hints.** Stats from a handful of trades say little. The same goes for other traders: check how many trades they have closed before you read much into a high win rate. - **Nexus records how you traded.** It is not a forecast, a signal or a recommendation, and it is not for copying other traders. ## What's new **September 2026** - **Clearer buttons and clickable strikes.** Buttons now shade when you hover, so you see what's clickable, and you can click options-chain strikes with a mouse in narrow windows. See [Place a paper trade: New Trade](#place-a-paper-trade-new-trade). - **Leaderboard says when rank tiers start.** The Leaderboard now shows the same 10-closed-trade bar for a rank tier that your rank uses, so you know exactly when you'll leave Unranked. See [Rankings: Leaderboard](#rankings-leaderboard). - **Your likes stick.** Something you liked now shows as liked by you, and a slow connection no longer undoes your like. See [Manage your trades: Trades](#manage-your-trades-trades). - **A refused trade tells you why.** If Nexus can't place your trade, the ticket now tells you why instead of doing nothing, so you know what to change. See [Place a paper trade: New Trade](#place-a-paper-trade-new-trade). - **Profile stats show only what was measured.** Your radar shows a dash, not zero, for unmeasured stats, Worst Loss replaces Max DD, trades count once, and Leaderboard popups show the correct followers. See [Your profile and wallet: My Profile](#your-profile-and-wallet-my-profile). - **Expiration dates you can rely on.** Expirations now show the year when it isn't this one, and the order ticket no longer shows your expiration a day early. See [Place a paper trade: New Trade](#place-a-paper-trade-new-trade). - **Options chain opens at the current price.** The chain now centres on the stock's price, you choose strike order, and a futures chart opens the matching ETF's options. See [Place a paper trade: New Trade](#place-a-paper-trade-new-trade). - **Live quotes recover on their own.** If your live price, trades or options chain stream drops, Nexus now reconnects by itself, so you no longer need to reload the page. See [Place a paper trade: New Trade](#place-a-paper-trade-new-trade). Every Nexus update: [skylit.ai/changelog/nexus](https://www.skylit.ai/changelog/nexus). ## Glossary Terms as they appear in Nexus. Where the app has its own wording, it is quoted. | Term | Meaning | | --- | --- | | **Absolute Apex** | The best return the contract reached, during the trade or after you exited. | | **Apex Giveback** | How much of the in-trade peak you gave back before closing. | | **Apex Return** | The best return an open trade has reached so far. | | **Arc** | A Nexus season, one calendar quarter long: Genesis, Ascension, Convergence, Apex. Arcs change the leaderboard only. | | **Auto-Expired** | A contract still open at expiration, closed automatically. | | **Cred** | Your Nexus reputation score, shown on your profile. | | **Guild** | A Discord server as a team on the leaderboard. Its row reflects the season roster its owner picks (up to five members), or its members when it has no roster. Your primary guild, set in Settings > Discord, is where your trades are posted. | | **Max Drawdown** (trade card) | The worst point a single trade reached. | | **Missed Upside** | The gap between the best return the contract reached, during or after the trade, and where you closed. | | **Rank tier** | Oracle, Omega, Ultima, Gamma, Delta, Theta. Earned after 10 closed trades; Unranked until then. | | **Simulated** | A paper trade in your Nexus wallet. | | **Snapshot** | The ticket's quote is not streaming, or is too old to count as live. | | **Verified** | A trade confirmed through a connected broker. Not available yet (see Good to know). | | **Wallet** | Your practice cash account, starting at \$100,000. There is one per member and it is permanent: seasons never reset it. | | **Worst Loss** | Your single worst closing return on the profile radar. Not an account drawdown. | --- Source: https://www.skylit.ai/docs/guides/tempest # Tempest field guide > See how big a move options are pricing for any stock, and whether that is a lot for that stock compared with its own history. > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. Past behavior of any reading or setup does not guarantee future results. > **Note:** **Beta.** Tempest is in beta for Pro members. Readings, panels and names can change while it is in beta. Not on Pro yet, or want to hear when Tempest opens wider? [Join the Tempest waitlist](https://www.skylit.ai/?waitlist=tempest&utm_source=docs). ## Why it matters Every option price carries a guess about how far the stock will move. Tempest reads that guess for you. It answers one question: **how much movement are options paying for, and is that a lot for this stock?** That tells you three things: - **How far options are pricing the stock to move** by today's close, this week or this month, in dollars. Traders use it as a yardstick for targets, stops and strikes. - **Whether options are cheap or expensive right now** compared with the stock's own past. - **Whether today's move is ordinary or unusual** for this stock, measured on its own ruler. > **Info:** **In plain English.** Option prices carry the market's guess of how much a stock will move. Expensive options mean it is bracing for big swings; cheap ones, a quiet stretch. SVX turns that guess into one number per stock. It sizes the swing, not its direction. ## Where to find it Tempest is available to Pro members during the beta. 1. In the sidebar, open the **Heatseeker** menu and pick **Tempest**. On a phone, tap the **Tempest** button in the nav bar. 2. Tempest opens on the radar. Type any ticker in the search box at the top to open that stock. | You want | Go to | | --- | --- | | Rank the whole market by rich or cheap options | Tempest > Radar (sort by any column, or pick a preset) | | Group by sector, theme or Mag 7 | Radar > Group (on a phone: the Filters sheet) | | Everything on one stock | Tempest > search the ticker (Summary, SVX, Moves, History, Skew, Imbalance, Earnings, Term, Sigma) | | Long history, usual range, skew line | Ticker > SVX history (3M to All, "Usual range", "Weekend-adjusted", "Put vs call skew") | | Past episodes of today's conditions for this stock | Ticker > Setups (right under the summary) | | How often this stock reached an at-the-money option's break-even in the past | Ticker > Expected move > Calibrated odds | | Expected-move bands on your chart | Atlas > plugins > Tempest (bands, levels and horizons in its settings) | | Tempest next to a live chart | Atlas > the Aegis panel > Tempest tab | | The S&P 500's volatility mood | Tempest > Market tab | | Fear & Greed, Mag 7 dispersion | Tempest > Market tab (the score also sits in the strip on every Tempest page) | | Dealer walls and exposure skew | The Heatseeker board (Tempest itself does not show dealer positioning). Talon can also give an upside or downside exposure-skew read. | | Ask in plain English, or combine Tempest with Heatseeker | Talon: see [Ask Talon](#talon) | ## What Tempest measures Every reading answers the same question: how much movement options are paying for, and whether that is a lot for this stock. ### SVX (Skylit Volatility Index) SVX is Skylit's proprietary volatility reading, one per stock, read from that stock's own options. It is stated as a yearly percentage: higher means options are pricing bigger moves. `SVX30` covers the next month, `SVX9` about two weeks, `SVX1D` the next session, `SVX3M` the next quarter. You don't need to convert SVX yourself. The SVX tiles and the Expected move panel show what each reading means as a price move, in % and \$. Expected moves in Tempest are 1σ (one standard deviation) moves. In the textbook bell curve, price finishes inside them on about 68% of days, and inside twice that on about 95%. Real stocks have more big days than the textbook. **Vol points** are the gap between two of these yearly readings. SVX 32 against SVX 30 is a 2 vol point gap. ![The SVX history panel: SVX30 and SVX1D over six months, with the usual-range band, an E marker at earnings, and the Weekend-adjusted and Put vs call skew checkboxes.](https://www.skylit.ai/docs/images/guides/tempest/svx-history.light.webp) ### Weekend-adjusted readings Stocks barely move on a Saturday, so options priced across a weekend look "cheaper per day" on a Friday afternoon and snap back on Monday. Left alone, the history line would saw-tooth every week and every Friday would look cheap just for being a Friday. So Tempest keeps two versions of each reading: - **SVX (standard)**: the headline number on every tile, card and radar column. - **SVX (weekend-adjusted)**: the same prices with that weekly calendar pattern taken out. Tempest's comparisons with each stock's past, such as percentiles, the usual-range band and setups, use it, and the history chart shows it by default (the **Weekend-adjusted** checkbox switches to the standard line). In a normal week the two sit close together. The adjusted one is just steadier from Friday to Monday. ### The readings, and the question each answers | Reading | It answers | What traders read from it | | --- | --- | --- | | **SVX %ile** (e.g. 30D vs 1y) | Are options expensive or cheap *for this stock*? | The main lens. The radar's Rich vol and Cheap vol presets pick out the top and bottom of each stock's own range. Pick the horizon that matches the period you care about (1D next session, 9D about two weeks, 30D a month). | | **IV rank 1y** | Where today sits between the year's low and high | A cross-check on the percentile. One spike can distort rank but not percentile. | | **Term 9–30** / curve | Is near-term fear above longer-term? | Positive (backwardation) = stress or an event now. Negative (contango) = normal, calm. | | **Expected move / cones** | How far options are pricing price to move by a date | A yardstick for targets, stops and strikes. Drawn on Atlas as bands. | | **Sigma (σ)** | How big today's move was, in expected moves | Under 1σ is ordinary; in the textbook, 2σ happens on about 5% of days and 3σ on about 0.3%. | | **Skew** (put vs call, %ile) | Are downside puts priced above upside calls? | Puts richer than usual = the crowd is paying for protection. A skew flip toward calls = demand for upside. | | **Premium imbalance** | At the same distance from price, which side is cheap? | Whether calls or puts are priced lower relative to each other. Only counted on actively traded contracts. | | **Earnings** · **VRP** (implied minus realized) | Is the report priced above or below the stock's past moves? | How this report's pricing compares with the stock's past reactions. | | **Settling back** | After readings like today's, how often did SVX return to normal within a month? | Historical context for how quickly high or low readings have eased back for this stock. | | **SVX / S&P** | How jumpy is this stock versus the index? | 2.0 = priced to move twice as much as the S&P 500. | ## Read it in 30 seconds Search a ticker in Tempest, then read it top to bottom: 1. **How big is the priced move?** Read the next-day and weekly expected move in % and \$. Many traders use it as a yardstick for targets and stops. 2. **Is it rich or cheap for this stock?** Read the SVX percentile, not the raw SVX. A 61 can be expensive for one stock and cheap for another. 3. **Why?** Check the earnings date, the term structure and the E markers on the history chart. Expensive options ahead of a known event have an obvious reason. Expensive options with no event in sight are harder to explain. 4. **Priced vs delivered.** Compare the Straddle and Realized columns in Expected move. Implied well above realized means options are charging for more movement than the stock has been making. 5. **Which side?** Skew and premium imbalance show whether calls or puts are priced lower relative to each other. ## Is SVX 100 a lot? On its own, no. SVX 100 means options are pricing large daily swings. For SPY that would be a crisis. For a meme stock it can be an ordinary week. That is why the radar ranks by each stock's percentile against its own history, not by raw SVX. **High SVX means options are expensive, not that they are overpriced.** Premium turns out "inflated" only if the stock then moves less than priced, which nobody knows in advance. Three checks describe how expensive it is today: - The percentile is near the top of the stock's own year. - Implied is above realized: the straddle or SVX-implied move sits clearly above the Realized column. - No known event falls inside the window: earnings, FDA, index rebalance. All three together is as close as Tempest gets to "rich". It is still a description of pricing, not a forecast. ## How to use it Tempest has four places to work from. Each has its own section below. - **[The radar](#radar-columns-presets)**: rank the whole market by how rich or cheap each stock's options are. - **[Ticker detail](#ticker-detail-section-by-section)**: everything Tempest knows about one stock, panel by panel, including [a day's sigma](#looking-up-a-days-sigma), [premium imbalance](#premium-imbalance-theory), [setups](#setups-what-happened-next) and [vol-trader reads](#vol-trader-reads). - **[Atlas cones and levels](#atlas-tempest-cones-levels)**: the expected move drawn on your chart. - **[The Market tab](#market-tab)**: the S&P 500's volatility mood and [Skylit Fear & Greed](#skylit-fear-greed). Then see [patterns traders watch](#patterns-traders-watch) and [how earnings show up](#earnings). ## Rank the market: the radar **Why it matters:** the radar shows which stocks have unusually cheap or expensive options today, each against its own history. No more checking names one by one. **Where:** Tempest opens on the radar. On desktop it sits on the left; on a phone it is a list of cards with a filter sheet. 1. Pick the **percentile basis** (Horizon × Lookback, e.g. `30D %ile 1y`). It drives the first column, the Rich/Cheap presets and the group medians. - Horizon: the period you care about. `1D` for the next session, `9D` for about two weeks, `30D` for the standard read, `3M` for a quarter. - Lookback (1y, 3y, 5y): how far back "usual" reaches. 2. Pick a **preset** to filter the list, or sort by any column. 3. Click (or tap) a row to open that stock's detail. ![The Tempest radar ranked by 30D %ile 1y: one row per stock with its 1y range, SVX30, SVX1D, IV rank and term, and badges such as Earnings in 5d and Skew flip.](https://www.skylit.ai/docs/images/guides/tempest/radar.light.webp) | Column | Meaning | What traders read from it | | --- | --- | --- | | SVX %ile | Today vs this stock's own past on the chosen basis | The default sort and the main "rich or cheap" read. | | 1y range | Lowest to highest SVX30 over the year | Context: how far vol has travelled for this stock. | | SVX30 · SVX1D | Month and next-session readings, as yearly % | SVX1D far above SVX30 = an event or stress tomorrow. | | IV rank 1y | Position between the year's low (0) and high (100) | Cross-check; a single spike can distort it. | | Term 9-30 | 9-day minus 30-day reading | Above 0 = backwardation: something is priced soon. | | Next-close move % | Move priced from now to the next session's close | The size of move priced for tomorrow. | | Sigma | Today's move in expected moves, with its odds | Where the unusual days show up. | | SVX / S&P | This stock's SVX30 ÷ the S&P 30-day | 2.0 = priced to move twice as much as the index. | **Extra columns** (desktop, Columns button): Curve, Skew 30d, Skew %ile, Tilt, Cheap side, Earnings in, Earnings move %, VRP, vs sector and **Fear/greed**. *vs sector* is how many percentile points the stock sits above or below its sector's median. *Fear/greed* is each stock's own 0–100 reading (see [Fear & Greed](#skylit-fear-greed)). **Group** the list by sector or theme (on a phone, in the Filters sheet) to see which groups are rich or cheap as a block. Each group shows its median percentile, median SVX30, median next-day move and how many names are rich. A whole sector going rich at once is a market story. One rich stock in a calm sector is a story about that stock. | Preset | Keeps | Often watched by | | --- | --- | --- | | Rich vol | Percentile near the top of the stock's range on the chosen basis | Premium sellers and reversal traders | | Cheap vol | Percentile near the bottom of the stock's range | Swing and breakout traders | | Backwardation | 9-day reading above 30-day | Traders watching for events and stress | | Sigma event | Today's move of 2σ or more either way | Reversal and momentum traders | | Big mover today | Today's move of 1σ or more | Intraday watchlists | | Earnings soon | Report within 10 days | Event traders | | Premium imbalance | One side unusually cheap, on actively traded contracts | Traders comparing calls and puts (see [premium imbalance](#premium-imbalance-theory)) | | Put skew extreme | Skew %ile at the top of its yearly range | Traders watching hedging demand | | Rich vs realized | Implied clearly above recent realized | Premium sellers | | Skew flip | Skew just flipped from puts-rich to calls-rich (the badge shows how many sessions ago) | Swing and breakout traders | | Coiled | A rare combination of skew, premium imbalance and vol readings on a quiet stock | Traders watching quiet stocks (see [Setups](#setups-what-happened-next)) | **Hide approximate** is on by default. It drops stocks with rough readings: too few quotes right now, or a share price so low that the numbers get coarse. ### Why the radar shows fewer names than Tempest covers The count above the radar reads "N of \ names". Tap or hover it to see where the rest are: - **Priced under \$5 — approximate**: on the radar, hidden while *Hide approximate* is on. - **Hidden by your filters**: presets, sectors, themes, watchlists. - **Too few quoted contracts for a reliable reading**: only a few of the name's option contracts had two-sided quotes, so a volatility reading wouldn't be reliable. These stay off the radar and out of rankings. - **No option quotes this session**: the name has listed options, but none were quoted. - **No listed options**: no listed options were found for the symbol. - **Couldn't be read on the last pass**: retried automatically. - **Not reached yet**: right after Tempest starts, during market hours; appears within minutes. Searching for a name that isn't on the radar still opens it, with a short note saying why. Thin names keep their flagged readings below that note. ## Read one stock: ticker detail **Why it matters:** one page shows how far the stock is priced to move and whether that is cheap or expensive for it. It also shows which side, calls or puts, is priced lower. **Where:** search a ticker in Tempest, or click a row on the radar. On a phone, the detail has a pinned header whose tabs jump between sections. 1. Read the **Summary** at the top first. 2. Jump to a section with the section tabs, or scroll. 3. Tap a panel's header to fold or unfold it. Tempest remembers your choice. Summary, Setups, SVX, Expected move, History, Skew and Sigma start open. Implied vs actual, Imbalance, Earnings and Term start folded with a one-line teaser. The section tabs open whatever they jump to. **On desktop** the radar and the ticker detail scroll independently, both below the toolbar. Drag the divider between them to resize (double-click resets it, arrow keys nudge it). Tempest remembers the split in your browser. ### Summary The panel is titled **In plain English**: a few sentences that read the whole picture. On a phone it opens with three numbers first: the **next-day move** (% and \$), **SVX30** with its percentile, and **today's σ** with its odds. ### SVX - **SVX %ile 1y** (the large number) with the 1y range and how many sessions it rests on. Under about 60 sessions, treat percentiles as provisional. - **Tiles:** SVX30, SVX1D, SVX9, SVX3M, SVX6M, each with its price-terms translation (for example "≈ ±16%/month"), plus IV rank, SVX/S&P, Term 9-30 and Curve. - **SVX across horizons:** a grid of percentiles, horizon (rows) × lookback (columns). Shading gets lighter as percentiles rise. Use it to see *where* the richness sits. A hot 1D row with a cool 3M row points to an event. Hot across the board is a lasting shift. - **Settling back:** a gauge of SVX30 against this stock's usual range, with the median marked. Below it, one sentence covers the past times SVX was this high (or low). It says how often SVX was back to usual within a month, how long that took, and how many episodes that rests on. With too few episodes, it says there isn't enough history. It describes this stock's past, not what SVX will do next. ### Expected move One row per horizon: **Today** (to today's close), **Next day**, **This week** (to Friday's close), **Monthly exp.** (to the third Friday) and **30 days**. Each row shows the 1σ move in % and \$, the price range it implies, the 2σ move, and two cross-checks: - **Straddle**: a second read of the same move, from at-the-money options. It should roughly agree with the main number. - **Realized**: how much the stock has actually been moving, scaled to the same horizon. Implied well above realized means options are charging for more movement than the stock has been making. Implied below realized means options are behind the stock. ![The Expected move panel for one stock: Today, Next day, This week, Monthly exp. and 30 days, each with the 1σ move in % and $, its price range, the 2σ move and the Straddle and Realized cross-checks.](https://www.skylit.ai/docs/images/guides/tempest/expected-move.light.webp) When price is already outside today's range, a neutral note says by how much, e.g. "Above today's expected range by \$0.56 (+1.80σ)". "On chart" marks the horizons currently drawn on Atlas. ### SVX history - SVX30 and SVX1D over **3M, 6M, 1Y, 3Y, 5Y or All**. The longer ranges switch to weekly points. - **Usual range** band: where SVX30 usually sat over the prior year, with a dashed median. Readings above the band are rich, below it cheap, each judged against what was usual at that time. - **Put vs call skew** line (toggle): above 0 puts cost more (demand for protection), below 0 calls cost more (demand for upside). - **E markers** flag the night before earnings, when SVX1D spikes by design because it includes the report move. - **Weekend-adjusted** by default, so the line does not dip every Friday and bounce every Monday. Untick **Weekend-adjusted** to see the standard readings. See [Weekend-adjusted readings](#weekend-adjusted-readings). ### Skew > **Info:** **In plain English.** Skew compares what traders pay for downside insurance (puts) with what they pay for upside bets (calls) the same distance from price. On most stocks puts cost more, the way flood insurance costs more near a river. When that gap narrows or flips toward calls, the crowd has started paying for upside. - **Skew 30d**: how many vol points protective puts cost above comparable calls, about a month out. **Skew %ile 1y** says whether that is unusual for this stock. - **Implied vol 30d** for the same expiry. - **Smile**: implied vol across strikes for the roughly one-month expiry, drawn next to its expected shape. Points far above the shape are locally expensive strikes; far below, locally cheap. - **Per-expiry skew** table: skew for each expiration. A front expiry far more skewed than later ones = near-term fear. ![The Skew panel: the spot-vol label, Skew 30d, Skew %ile 1y and Implied vol 30d, the smile against its expected shape, and skew for each expiration.](https://www.skylit.ai/docs/images/guides/tempest/skew.light.webp) ### Premium imbalance Which side is cheap, how lopsided, how unusual, and whether the contracts trade well enough to trust. Full explanation in [Premium imbalance](#premium-imbalance-theory). ### Earnings - **Earnings in** (days), **priced move (1σ)** for the report day, and the **typical past move** after recent reports. - **Past reactions** as bars, one per recent report, signed. - **VRP box**: how many vol points implied sits above recent realized, with its percentile. It also shows how often, over the past year, options priced more movement than the stock then delivered ("pricier than what followed"). That is a description of the past year, not a forecast. ### Term structure > **Info:** **In plain English.** Normally the market is calmer about next week than about the months after, so near-dated vol sits below later-dated vol. That is contango, the calm state. When next week is priced as rougher than the months after, that is backwardation: an event is coming, or stress is already underway. One row per expiration: days to expiry, implied vol and the straddle-implied 1σ move. The implied vol here can run a little above the at-the-money figure brokers show. The table shows how pricing changes from one expiry to the next. A kink up at one date usually marks an event. This section starts folded. ### Sigma > **Info:** **In plain English.** Sigma measures today's move with the stock's own ruler. If options price a stock for about 2% a day, a 4% day is 2σ. If SPY is priced for about 1%, a 2% day is also 2σ. That makes a quiet index and a jumpy small cap comparable. - **Running**: today's move so far in σ, with the prior close, its date and the move in dollars ("vs 773.52 (Sep 22) · −\$0.08"). - **Last big move**: a chip for the latest 1.5σ+ session in the past week, e.g. "Sep 21 +2.27σ · a 2.3% day". - **Calibration**: one line on whether this stock has broken its expected range more or less often than options priced, over its recent history. Example: "SPY breaks its expected range less often than options price: 1σ+ days 22% vs 32%". A **fat tails** flag appears when its 2σ days have run well above the textbook rate. - **Priced for today**: the move options priced at the prior close for today's session, in % and \$. - **Budget left**: how much movement options still price between now and the close ("session closed" outside regular hours). - **The 60-session strip**: tap or drag to read any day (see [Look up a day's sigma](#looking-up-a-days-sigma)). 2σ+ days are drawn brighter so they stand out without tapping; E marks earnings reactions. - **Odds**: how often moves this big happen, textbook vs this stock's own history. A stock whose own 2σ days happen far more often than 5% has fat tails. - **Big-move give-back**: after past 1.5σ+ days, how often price gave back at least half within a week, with the number of episodes. It describes this stock's past, not what happens after the next big day. - **Sigma scale**: the four textbook bands (within ±1σ 68%, 1–2σ 27%, 2–3σ 4.3%, beyond 3σ 0.3%) with today's band highlighted. ![The Sigma panel: Running, Priced for today and Budget left, the calibration line, the 60-session strip with an E marker, big-move give-back and the sigma scale.](https://www.skylit.ai/docs/images/guides/tempest/sigma.light.webp) ## Look up a day's sigma **Why it matters:** one tap tells you whether yesterday, or any of the last 60 sessions, was ordinary for that stock or rare. **Where:** Tempest > search a ticker > **Sigma**. A shorter strip (the last 30 sessions) is in the Aegis Tempest tab on Atlas. 1. Open **Tempest** (sidebar Heatseeker menu, or the Tempest button in the phone nav bar) and search the ticker. 2. Go to **Sigma** (on a phone, tap the *Sigma* tab in the pinned header). 3. The strip shows the last 60 sessions, with the tallest bars the biggest moves. It opens on the latest session. Tap or drag across it (arrow keys on desktop) to read any day. The readout says, for example: `Sep 22: closed −0.02σ · moves at least this big happen on about 99% of days · day's range 0.5σ`. A normal day, in other words. "Closed" measures close-to-close against the move options priced at the prior close. "Day's range" measures high-to-low in the same units. ## Premium imbalance: which side is cheap **Why it matters:** it shows whether calls or puts are priced lower relative to each other today, after allowing for the stock's usual tilt. **Where:** Ticker detail > **Imbalance**, the **Premium imbalance** preset on the radar, and the Tilt and Cheap side columns (Columns button). > **Info:** **In plain English.** Think of a shop that always charges more for umbrellas than sunglasses. That markup is normal. Premium imbalance asks whether umbrellas, or sunglasses, are unusually cheap *today* compared with that shop's usual markup. Puts are the umbrellas; calls are the sunglasses. **The idea:** options are not priced evenly on both sides. Out-of-the-money puts normally cost more than calls the same distance away, because investors pay up for crash protection. Every stock has its own normal tilt. Premium imbalance asks a sharper question: *after allowing for that normal tilt, is one side unusually cheap today?* To read it: 1. Open a ticker and unfold **Imbalance** (it starts folded). 2. Read **Cheap side** first. Then read **Tilt** and **Tilt vs history** to see how lopsided and how unusual it is. 3. Check that the contracts trade well enough to trust (see the guards below). To find names across the market, pick the **Premium imbalance** preset on the radar. ![The Premium imbalance panel for one stock: the cheap side, put/call price, same-distance ratio and tilt vs history, the legs against their lows, and the tilt for each expiration.](https://www.skylit.ai/docs/images/guides/tempest/imbalance.light.webp) ### The readings, from rough to refined | Reading | What it tells you | | --- | --- | | **Put/call price** | A quick first read of how put prices compare with call prices near the current price. | | **Same-distance ratio** | The same comparison, made fair for where the nearest strikes happen to sit. Still includes the normal put premium every stock carries. | | **Tilt** (vol pts) | The core number: how lopsided the two sides are compared with this stock's normal pricing. Positive = puts rich / calls cheap; negative = calls rich / puts cheap. | | **Tilt vs history** (%ile) | Today's tilt against this stock's own past year ("new" while history is short). Separates a genuinely unusual day from a stock that is always lopsided. | | **Cheap side** | Calls or puts: whichever is priced low relative to the other. The one-word answer. Read it with the tilt and the guards below. | ### The legs For the headline expiry, the ticker detail shows how far each leg, the call and the put, trades **above its lowest price** since it started trading, with that low and its date ("At its low" when it is there). On the radar, the **Premium imbalance** preset switches to its own columns, including each leg's **price and strike** (*Call price @ strike*, *Put price @ strike*) and *Cheap leg vs its low*. A cheap side whose leg is also at its low is cheap two ways: against the other side *and* against its own history. The per-expiry table repeats the read for each expiration. That shows whether the imbalance sits on one date or across the whole curve. ### Two guards against false readings - **Liquidity:** the contracts must actually trade, with tight quotes and real interest or volume at that strike. Otherwise the imbalance can come from stale quotes. Only liquid readings count for the radar preset. - **Consistency:** when nearby strikes disagree in a way that means the reading is off, Tempest marks it inconsistent and never counts it as liquid. ### What traders read from it - **Which side is priced lower.** Traders who have already formed a view look at it to compare calls and puts before choosing between them. - **Which side is rich.** Premium sellers look at the side that is priced higher than usual. - **Sentiment.** Calls unusually cheap means few traders are paying for upside. Some traders compare that with Heatseeker's [exposure](#pairing-with-heatseeker). > **Warning:** **Keep in mind.** > > - Imbalance tells you which side is *cheaper*, not which way the stock will go. > - Around earnings both sides reprice and the tilt can swing; read it after the report. > - After the close, the liquidity check reflects the session's last live reading. ## Expected moves on your chart **Why it matters:** you see the priced range right on the candles, as reference levels, without switching screens. **Where:** on Atlas, open plugins > **Tempest**, then the gear for its settings. The **Tempest** tab in Atlas's **Aegis** panel shows the same readings in a compact panel next to the chart, including the tappable sigma strip. On a phone it opens as a sheet. 1. Turn on the Tempest plugin on Atlas. 2. Open its settings (gear) and choose **Show**: Cones, Levels (Daily range / Weekly range / ±2σ lines), or both. 3. Pick the **Cone horizons** and **Bands** (68%, 95%, Labels, Out-of-range note), then set **Band opacity** so the bands stay readable under your other plugins. The plugin has two layers that answer different questions. #### Cones: the priced range from here Anchored to the last bar · widen with time Cones draw the priced range forward from now to the end of each horizon. **Cone horizons:** Today (to the close), Next day, This week (to Friday), Monthly (third Friday), 30 days. Defaults: Today + This week. - Inner **68% band** (1σ) and outer **95% band** (2σ), each can be turned on or off. Fills grow lighter toward the horizon. - **Price tags** at the band ends show the actual prices, e.g. "Today 1σ 775.20" / "768.26", plus the 2σ pair on the nearest horizon. ![A Tempest cone on an SPY chart in Atlas: the 1σ and 2σ bands widening from the last bar to the end of the week, with price tags at the band ends.](https://www.skylit.ai/docs/images/guides/tempest/atlas-cones.light.webp) #### Levels: fixed lines, like exposure levels Anchored to a past close · don't move intraday Horizontal price lines at the range options priced at a fixed moment, drawn like Heatseeker's exposure levels and following zoom and pan. - **Daily range**: today's 1σ range as priced at the prior close. - **Weekly range**: this week's range as priced at last week's final close. - **±2σ lines** (optional): the 95% edges of each. ![Tempest levels on a TSLA chart in Atlas: the daily and weekly ±1σ lines, each labeled with its price on the right axis, beside the cone.](https://www.skylit.ai/docs/images/guides/tempest/atlas-levels.light.webp) **In Atlas replay** the range levels and the out-of-range note are hidden: they show today's option pricing, which would mislead on past bars. The cone is hidden too, unless you turn on **Cone at replay time** in the Tempest plugin's settings (off by default). #### Replay and pin: how a cone played out As priced at the replay time · frozen once pinned - **Turn it on:** Atlas plugins > **Tempest** > settings > **Cone at replay time** ("pin to score it"). - **In Atlas replay** the cone is the one options priced at the replay time, never a later one, drawn from that moment's price. The panel at the bottom left says when: "as priced at 13:14". Before a session's first reading, or after the close, it is the previous close's cone; **reconstructed** means that close cone was rebuilt from the day's stored history. Today's live cone never appears on past bars. - **Pin** freezes the cone on screen (in replay or live). As the replay moves on, or new bars arrive, the panel scores it using only bars that had closed by then: the share of closes inside 1σ, where the latest close sits in σ, the furthest move in σ, when price first closed outside 1σ, and when it first reached 2σ. A check mark means that horizon has ended. - Right after a pin the band is very narrow, so the first bar or two often read as outside 1σ. - Replays start on Sep 23, 2026 for readings taken during the session; earlier days show the close cones. ### How traders read them - **Reversal traders** watch the *levels* as places where a move has already covered what options priced, often next to Heatseeker's walls (see [Heatseeker terms](#pairing-with-heatseeker)). The weekly lines frame multi-day moves. - **Breakout traders** watch closes through the daily 1σ line, and whether SVX1D is rising with them, as a sign a move is running larger than priced. - **Option traders** use the *cones* to see where strikes sit against the priced range at a given expiry. - **Out-of-range note** (on by default): a small neutral tag when price is already outside today's range, so you notice a 1σ+ day without checking Tempest. ## Market tab **Why it matters:** the same reading means something different in a calm market and a stressed one. The Market tab tells you which one you are in before you look at a single stock. **Where:** Tempest > **Market** tab. The strip across the top of every Tempest page shows the regime, S&P 30-day, 30d/3m, vol of vol and tail-risk readings at a glance. Read the **Regime** word first. Then check the rows below for what is driving it. | Reading | Meaning | A common read | | --- | --- | --- | | Regime | One word: **calm**, **normal**, **elevated**, **stressed**, **crisis** | Context for every other reading. Many traders check it first. | | S&P family 1D / 9D / 30D / 3M / 6M | Tempest's readings for the S&P 500 across horizons, drawn as a term curve | Higher = options pricing bigger index moves. Comparing horizons shows whether the worry is near-term or later. | | 30d / 3m ratio · Curve | Near-term vs 3-month; contango / flat / backwardation | Ratio above 1 (backwardation) = acute stress. | | VIX futures curve · M1→M2 | Where traders price the VIX for coming months; the roll between the first two | A steep positive roll is the calm normal; flat or negative = stress. | | Vol of vol | How much the 30-day reading itself is expected to swing | High vol of vol with a low VIX = traders are paying for the chance of a volatility jump. | | Tail-risk pricing | Extra paid for crash protection | High = demand for hedges. | | Crowded calm | Near-term fear unusually low relative to later *and* vol of vol unusually low | Very quiet conditions that leave little cushion if something surprises. | ## Skylit Fear & Greed **Why it matters:** one number for the market's mood, read from what options traders are actually paying, not from headlines or surveys. **Where:** Tempest > **Market** tab for the gauge and its history. "Fear & Greed 38 · Fear" sits in the strip on every Tempest page. Per stock: add the **Fear/greed** column on the radar (Columns button). The score runs 0–100. 0 is extreme fear, 100 extreme greed. Bands: under 20 extreme fear, 20–40 fear, 40–60 neutral, 60–80 greed, 80+ extreme greed. The score is built from several options-market readings, for the S&P 500 and across the stocks Tempest covers. The Market tab shows which of them are driving today's score. The Market tab shows: - the gauge, with one plain-English read of where the score sits against its recent past - the components, sorted so the ones driving the score come first (up to six) - the score's history ![Skylit Fear & Greed on the Market tab: the 0 to 100 gauge, one plain-English read, the components sorted by how much they drive the score, and the score's history.](https://www.skylit.ai/docs/images/guides/tempest/fear-greed.light.webp) **Per stock:** the radar's optional *Fear/greed* column gives each stock its own 0–100 reading, built from that stock's own options pricing. A stock in fear while the market is neutral is stress specific to that stock. A stock in greed while the market is in fear stands apart from the market in the options market. ### How traders read it - **Extreme fear** comes with expensive protection and rich premium across many names. Reversal traders watch those stretches for signs of capitulation in price, alongside Heatseeker. - **Premium sellers** note that fear means rich premium, and watch whether the score is still falling or has started to turn. - **Momentum traders** watch greed with a calm term structure. Extreme greed together with "crowded calm" is widely read as complacency. These are ways traders read the score, not signals. ### Mag 7 dispersion On the Market tab. It compares how big a move options price for the Mag 7 names with the move priced for QQQ, as a ratio with its percentile. Example: "Mag 7 options price 1.68× the QQQ's move, 22nd %ile". **High**: the big names are priced to move on their own stories. **Low**: they are priced to move together with the index. ## Setups: past episodes for this stock **Why it matters:** one memorable chart can mislead. Setups shows, for this exact stock, how often a condition came before a big move in the past, next to how often big moves happened anyway. **Where:** Ticker detail > **Setups**, right under the summary. Skew flip and Coiled are also radar presets, with badges on rows and cards. > **Warning:** **Historical, not a forecast.** Setups are descriptive statistics from each stock's own recent history, measured on that same history. They describe what followed before. They do not predict what the stock will do next, and they are not tested trading signals. For each stock, Tempest finds the past times it was in a given condition. It reports what followed **for that stock**, always next to a **base rate**. The base rate is how often the same thing happened in any stretch of that length. 1. Open a ticker. Setups sits right under the summary. 2. Find the conditions the stock is in now. 3. Compare each figure with its base rate, and check how many past episodes it rests on. | Setup | Condition | | --- | --- | | Vol in its cheapest 10% | SVX30 at the bottom of its range for the year | | Vol in its richest 10% | SVX30 at the top of its range for the year | | A +2σ / −2σ day | A close-to-close move of 2 expected moves or more | | Skew flipped to calls | Put-vs-call skew recently went from puts-rich to calls-rich | | Near-term vol above the month | The 9-day reading moved above the 30-day (term inversion) | | **Coiled** | A rare combination of skew, premium imbalance and vol readings (see below) | Each line gives, for the past episodes of that condition: how many there were, the median size of the move over the next 20 sessions, how often that move was up, the largest moves each way, and how often a 2σ day followed within 10 sessions, next to the same figure for any 10-session stretch. The base rate is the part to read first. It shows whether, in this stock's past, 2σ days came more often after the condition than they did anyway. A gap between the two describes the past; it is not odds for the next episode. ### Coiled Coiled marks a quiet stock where the options crowd has started leaning toward upside. It needs several skew, premium-imbalance and vol readings to line up at once. It is strict on purpose, so it is rare. Most stocks have no past episodes yet and show "not enough history". Where it has history, its line shows the episode count and the base rate next to it. It appears as a radar preset, a badge on rows and cards, and highlighted at the top of the stock's Setups. > **Warning:** **Read the counts.** A setup with 5 past episodes is a hint, not a statistic. The base rate is there so a figure is read against the stock's own ordinary stretches, not against nothing. ## Vol-trader reads **Why it matters:** these panels compare what options priced with what the stock then did, over its own past. Has this stock moved more or less than priced? **Where:** all inside the ticker detail. | Read | Panel | | --- | --- | | Implied vs actual | Its own panel (starts folded) | | Spot–vol behaviour | Skew | | Earnings record | Earnings | | Forward vol | Term structure | | Calibrated odds | Expected move | ### Implied vs actual > **Info:** **In plain English.** Implied is the move the options market charges for. Realized is the move the stock actually made. Comparing the two shows whether options have been charging for more movement than the stock delivered, or less. The chart plots SVX30 against how much the stock has actually been moving lately. Next to it: today's gap, its percentile, and how often implied was above realized over past sessions. - A wide gap at a high percentile means options are priced well above recent movement. - A negative gap means realized is above implied: options are behind the stock. Both describe the past; neither says what the stock will do next. ### Spot–vol behaviour Shown in the Skew section, with the correlation. It is one of three labels: - **Normal**: vol rises when the stock falls. Most stocks. - **Call-skew**: vol rises with the stock, a call-skew regime. Seen in meme and squeeze names. - **Mixed**: neither. ### Earnings record For recent reports, the move priced going in sits next to the move that happened. One line sums it up, e.g. *"the priced move was bigger than the actual move in 6 of 8 reports"*. It describes past reports only. ### Forward vol The vol priced *between* two expirations, e.g. Oct 16 to Nov 20. It is a column in Term structure, with a sentence naming the cheapest and richest window. A rich window often lines up with a scheduled event. ### Calibrated odds In Expected move. For **1 week** and **1 month**, Tempest shows: - the move an at-the-money option needs by expiry to break even, in % - the **textbook** odds of reaching it - how often **this stock actually got there** over its past year, up (calls) and down (puts), each time against what options priced then Your broker shows each contract's breakeven and a model probability. This panel shows how often this stock reached that break-even in its own past year. It is history, not the odds for any option you hold. ## Patterns traders watch Traders use Tempest's readings as context next to price, levels and flow. Below is what different kinds of traders commonly look at. These are descriptions, not recommendations. They are not tested signals, and nothing here says what a stock will do. #### Reversal traders They watch moves that have already run past what options priced: a 2σ day on the **Sigma event** preset, price at a band edge on Atlas, and the stock's own big-move give-back history in Sigma. Many read those next to Heatseeker's walls. Timing comes from price, not from Tempest. #### Swing traders They watch cheap premium: the **Cheap vol**, **Skew flip** and **Coiled** presets. Cheap premium has a catch: SVX is usually low *because* the stock has been quiet, and it can stay quiet. An earnings date inside the window means the premium is not really cheap (check the Earnings panel). #### Breakout and momentum traders They watch whether options start pricing a bigger move while price clears a level: SVX1D rising, the term curve moving toward backwardation. They also check the Market tab, because in a stressed market the same breakout reads differently. #### Premium sellers They look at how rich premium is for the stock (SVX %ile), whether implied sits above realized, whether an event falls inside the expiry, and how the settling-back history reads. The warning signs they watch: a backwardated term, negative gamma on Heatseeker, and low-priced stocks whose live readings run high (see [Good to know](#good-to-know)). ## Around earnings **Why it matters:** options usually get expensive into a report and cheaper right after. Tempest shows whether this report is priced above or below the stock's usual reaction. **Where:** ticker detail > **Earnings** (starts folded), and the E markers on SVX history. - **Priced move vs typical past move:** the Earnings panel shows the 1σ move priced for the report next to the stock's past reactions. Past reactions describe past reports, not this one. - **SVX1D spikes the night before by design** (E markers on the history chart). Don't read that spike as "rich" on its own. - **After the report, vol usually drops.** The morning after, premium is often much cheaper than the night before. ## Use it with other Skylit tools > **Info:** **In plain English.** Market makers hedge the options they hold. In positive gamma, that hedging means buying dips and selling rallies, which tends to dampen moves. In negative gamma, they hedge by trading with the move, which tends to speed it up. Heatseeker shows which regime a level sits in. Tempest shows what the move costs and how big it is priced to be. Heatseeker shows where dealers are positioned. Heatseeker terms used in this guide: - **GEX / VEX**: Heatseeker's gamma exposure and vanna exposure views. - **Positive gamma / negative gamma**: positive and negative nodes on the GEX view. - **Wall**: a large node, usually acting as a floor or ceiling. - **Exposure skew**: whether more of the board's exposure sits above price or below it. Heatseeker has no single readout for it. Read it off the board, or ask Talon, which reports it as upside, downside or balanced. The Heatseeker guide covers these in more depth. Together: | Heatseeker shows | Tempest shows | A common read | | --- | --- | --- | | Positive gamma wall at a level | That level sits near a 1σ band edge | Two separate readings pointing at the same area. | | Upside exposure skew | SVX %ile low, skew leaning to calls | Upside priced low while positioning leans up. | | Negative gamma below | Term backwardated, SVX rising | Conditions many traders associate with larger moves. | | Wall far outside the bands | Low SVX | Options are not pricing a move that far. | On **Atlas**, the Tempest plugin draws the bands and levels next to your other plugins (see [Expected moves on your chart](#atlas-tempest-cones-levels)). **Talon** can combine Tempest readings with Heatseeker exposure in one question (see [Ask Talon](#talon)). ## Ask Talon **Why it matters:** ask for any Tempest reading in plain English, from any page, without building filters by hand. Talon can also combine Tempest with Heatseeker exposure in one question. **Where:** open Talon from any page and type your question. Talon reads the same numbers as the Tempest page. It says when they were taken (after hours, e.g. "readings are from the Sep 22 close") and describes what options are pricing. It does not give trade advice or explain how readings are calculated. | You want | Ask Talon | | --- | --- | | Cheap or rich premium across the market | "Which names have cheap vol right now?" · "Top 10 rich-vol names in semis" | | A level or a percentile | "Tickers with SVX30 below 20" (the level) · "SVX percentile under 10" (vs each stock's own year). A bare "SVX below 20" is read as the level; Talon says the percentile reading is also available. | | Combine with Heatseeker exposure | "Cheap vol names with upside exposure skew" · "SVX under 20 and GEX leaning up" · "Rich vol with downside VEX skew" | | Presets | "Which names just had a skew flip?" · "Show coiled names" · "Premium imbalance where calls are cheap" · "Backwardation" · "Sigma events today" · "Earnings in the next 10 days" · "Rich vs realized" | | Your own list | "Coiled names on my watchlist" · "Cheap vol on my Swing watchlist" · "Mag 7 by SVX percentile" · "Energy names with put skew extreme" · "NVDA, AMD, AVGO compared" | | One stock | "Is NVDA's premium rich or cheap?" · "Everything Tempest has on AAPL" · "TSLA implied vs realized" · "AAPL earnings priced move and record" · "QQQ term structure" · "SPY skew and premium imbalance" | | A day's sigma | "What sigma did SPY close yesterday?" · "QQQ on Sep 21 in sigmas" · "SPY's 2σ days in the last 60 sessions" | | Expected moves and history | "NVDA expected move this week" · "SPY daily range levels" · "How often did MSFT reach an at-the-money break-even over a month?" | | Past episodes | "What setups is NVDA in, and what followed before?" | | The market | "What is the vol regime?" · "Fear & Greed today, and what is driving it?" · "Mag 7 dispersion" | | Meaning | "What does the skew flip badge mean?" · "What is Coiled?" · "If puts are cheap, does that mean the stock goes up?" | How it behaves: - **Heatseeker combinations check every match.** Talon filters Tempest first, then reads Heatseeker exposure for every name that matched. Names without a recent Heatseeker reading are left out, and Talon says how many. - **Approximate names are left out** unless you ask for them ("include approximate"). - **After the close** everything is the close reading; during market hours it is live. - **Cheap is not a direction.** Cheap puts mean puts cost less than usual relative to calls; they do not say which way the stock goes. Talon will say so. ## Good to know - **Tempest is in beta.** Readings, panels and names can change during the beta. - **Tempest describes what options are pricing.** It is not a forecast and not a recommendation. Expensive options can stay expensive, and cheap options on a quiet stock can stay cheap. - **Low-priced stocks read high during market hours.** For stocks under about \$10, live readings can run noticeably higher than the same stock's after-close reading, so they can look richer than they are. For stocks under about \$25, lean on the after-close readings. - **"Approximate" means rough.** Names with too few quotes, or a very low share price, are marked *Approximate*. The radar hides them by default. Read them as a rough guide. - **Short history means provisional percentiles.** Under about 60 sessions of history, treat a stock's percentiles as provisional. - **Setups, settling-back history, calibrated odds and percentiles describe each stock's own past**, measured on that same history. They show what happened before, not what will happen next. Small counts (a handful of past episodes) are hints. - **Fear & Greed's history uses fewer ingredients than today's score**, so the history line and the live score can differ a little. - **Expected-move bands have run a little wide**, which is normal when options carry a premium over the moves that follow. - **The patterns in this guide describe what traders watch.** They are not recommendations and not tested signals. - **Not in Tempest yet:** alerts on volatility events, options flow combined with volatility, and skew history by delta. ## What's new **September 2026** - **Earnings card no longer calls one report typical.** With fewer than three past earnings reports on file, the earnings card shows how many reports it has instead of calling the move typical or giving a priced-vs-usual verdict, and notes that more history is loading. See [Earnings record](#earnings-record). - **Light mode for Tempest.** Tempest, the Tempest cards in Aegis, and the Tempest Cone on Atlas now follow your light or dark mode setting instead of always showing dark. - **Clearer Tempest Cone panel on Atlas.** The Tempest Cone panel says exactly which cone you're viewing and why, its controls and columns get short explanations, and it now sits bottom-right so it no longer covers the chart, the drawing tools, or, on phones, the Calf's toolbar. See [Expected moves on your chart](#atlas-tempest-cones-levels). - **Replay and pin Tempest cones on Atlas.** Turn on Cone at replay time in the Tempest plugin's settings to see, in Atlas replay, the cone options priced at that moment. Pin a cone and a scorecard tracks price against it. See [Expected moves on your chart](#atlas-tempest-cones-levels). - **Weekend-adjusted SVX.** Percentiles, setups, the usual range and SVX history use a weekend-adjusted reading, so Fridays stop looking cheap. A Weekend-adjusted checkbox on the history chart shows the standard reading. See [Weekend-adjusted readings](#weekend-adjusted-readings). - **Why some names aren't on the radar.** Tap or hover the name count above the radar to see where the rest are. Search a name that isn't on the radar and it opens with a short note saying why. See [Why the radar shows fewer names than Tempest covers](#why-the-radar-shows-fewer-names-than-tempest-covers). - **Tempest in Talon.** Ask Talon about cheap or rich names, presets, one ticker, a day's sigma or the market regime, even combined with Heatseeker exposure skew. See [Ask Talon](#talon). - **Resizable radar and detail panes.** On desktop, drag the divider to resize the radar and ticker detail; the toolbar no longer covers them. Dealer levels moved to Heatseeker. See [Read one stock: ticker detail](#ticker-detail-section-by-section). - **Setups and the Coiled preset.** Each ticker shows what followed past times in the same condition, next to a base rate. Skew flip and Coiled join the presets. See [Setups: past episodes for this stock](#setups-what-happened-next). - **Implied vs actual, earnings record and calibrated odds.** Ticker detail adds implied vs actual vol, spot-vol behaviour, earnings record, forward vol and calibrated odds. Panels fold and stay how you left them. See [Vol-trader reads](#vol-trader-reads). - **Skylit Fear & Greed and Mag 7 dispersion.** The Market tab adds a Fear & Greed gauge built from options pricing, plus Mag 7 dispersion. The score also sits atop every Tempest page. See [Skylit Fear & Greed](#skylit-fear-greed). - **A clearer Sigma panel.** You see moves in dollars, the last big move, whether the stock breaks its range more than priced, and a tappable 60-session strip. See [Sigma](#sigma). - **Tempest on your phone.** On a phone the radar becomes cards with a filter sheet, and ticker detail gets a pinned header with section tabs. See [Where to find it](#where-everything-lives). - **Premium imbalance preset fixed.** The Premium imbalance preset had shown few or no names, especially after the close. Heavily traded names such as QQQ and AAPL now appear. See [Two guards against false readings](#two-guards-against-false-readings). - **Longer SVX history with a usual range.** SVX history reaches back up to five years, with a usual-range band and optional skew line. Settling back shows how often similar readings normalized. See [SVX history](#svx-history). Every Tempest update: [skylit.ai/changelog/tempest](https://www.skylit.ai/changelog/tempest). ## Glossary Every term as the app defines it. Terms as they appear in the app (71 terms). | Term | Meaning | | --- | --- | | **1y range** | The lowest and highest SVX30 over the past year. Puts today's reading in context: near the bottom of the range, options are about as cheap as they have been all year. | | **2σ day within 10 sessions** | How often a day of at least two expected moves followed within 10 sessions of the setup, next to how often that happens in any 10 sessions for this stock. The gap between the two numbers is what the setup added; without the second number the first can look more special than it is. | | **2σ move** | Twice the expected move. Moves this large happen on only about 5% of days. A useful outer boundary for what would count as a very unusual move. | | **30d / 3m ratio** | The 30-day reading divided by the 3-month reading. Below 1 means near-term fear is lower than later. It is the quickest way to tell a calm market (well below 1) from a stressed one (above 1). | | **Approximate** | Approximate: at this share price, the smallest option price increments make readings coarse. Small moves in option prices show up as big jumps in the numbers, so read them as rough. | | **Big-move give-back** | After days that moved 1.5σ or more, how often the price gave back at least half of that move within a week. It shows whether big days for this stock have tended to stick or fade. | | **Budget left** | How much more movement, in percent, options are still pricing between now and today's close. The remaining expected move shrinks as the day goes on, so a big move late in the session stands out more. | | **Calibrated odds** | An at-the-money option breaks even on about a 0.40σ move. This shows the textbook odds of that next to how often this stock actually moved that far, up and down, over its past year. Textbook odds treat every stock the same; this stock's own record shows whether its moves have tended to run past or fall short of what options priced. | | **Cheap side** | Which side, calls or puts just out of the money, is priced lower than usual relative to the other. An unusual imbalance shows which way the market is leaning. | | **Coiled** | Skew has just flipped to calls and sits near its lows for this stock, calls are cheap next to puts, and volatility is not expensive. It is a quiet, low-priced stretch that on some stocks has come before large moves; the history shows how often that held here. | | **Crowded calm** | Near-term fear is unusually low relative to later AND volatility of volatility is unusually low. Very quiet conditions leave little cushion, so a surprise can move volatility sharply. | | **Curve** | Whether near-term volatility sits below (contango), level with (flat) or above (backwardation) longer-term volatility. Contango is the normal calm state; backwardation shows up when fear is high right now. | | **Data quality** | Fewer quotes than usual right now, so treat this as approximate. Numbers built on less trading are less reliable and can jump around. | | **DTE** | Days until this expiration date. Nearer dates react faster to news; farther dates reflect longer-term expectations. | | **Earnings in** | Calendar days until the next earnings report. Option prices usually rise into earnings and drop right after. | | **Expected move** | The size of move, up or down, the options market is pricing for this stock over the period shown. About 68% of the time the actual move ends up smaller. It turns volatility into a price range you can picture on a chart. | | **Fear/greed** | The same 0-100 mood reading for one stock, from its own options: how pricey they are against its past, how much protection is in demand, and which side's premiums are richer. Low means its options lean fearful for this stock; high means they lean relaxed or eager. | | **Forward vol** | The volatility options price for just the stretch between one expiration and the next, as a yearly percentage. It shows which weeks ahead the market expects to be calm or busy — an earnings date usually makes its window the richest. | | **From low** | How far this option's price is above its lowest price since it started trading, in percent. Near 0% means it is at or close to its cheapest level so far. | | **Implied beat actual** | How often, on past sessions, the move options priced for the next 20 sessions was larger than the move that actually followed. It shows whether options on this stock have usually been priced above or below what the stock went on to do. | | **Implied vol (full smile) %** | The options market's estimate of yearly movement for this one expiration date, read across all option prices, which runs a little above the at-the-money figure brokers show. Lining up expiration dates shows which periods the market expects to be calm and which turbulent. | | **Implied vs actual** | SVX30 (what options price for the next month) next to how much the stock has actually moved over the last 20 sessions, both as yearly percentages. When implied sits well above actual, options are pricing more movement than the stock has been delivering. | | **IV rank 1y** | Where today's SVX30 sits between the past year's lowest reading (0) and highest reading (100). It shows how close today is to the year's extremes; one past spike can make it read low even when volatility is elevated. | | **Leg price** | The price of the nearest out-of-the-money option on that side, and the price level it pays off beyond. These are the two options the imbalance compares. | | **Liquidity** | Whether these options trade enough, with tight enough prices, for the numbers to be dependable. Imbalances in rarely traded options are often just stale prices. | | **M1→M2** | How much the second VIX futures month is priced above the first, in percent. A steep positive gap is the calm normal; a negative one means near-term fear is priced above later fear. | | **Mag 7 dispersion** | How big a move options price for the Mag 7 names on average, compared with the move priced for the QQQ as a whole. High means the big names are expected to move on their own stories (a stock-picking market); low means they are expected to move together (an index market). | | **Odds** | How often moves this big happen: the textbook bell-curve figure next to how often they actually happened for this stock. Real stocks have more big days than the textbook says; the second number shows by how much. | | **Priced for today** | The move, up or down, options priced at the prior close for today's session, as a percent of the price. Sigma measures today's move against exactly this figure. | | **Priced move (1σ)** | The one-sigma move, up or down, options are pricing for the day of the next earnings report. It shows how big a reaction the market is bracing for. Brokers' "expected move" figures (from the at-the-money straddle) run about 20% smaller. | | **Priced vs actual** | For each past report: the move options priced going in, next to the move the stock actually made. It shows whether this stock has usually moved less or more than its earnings were priced for. | | **Pricier than what followed** | How often, over the past year, options priced more movement than the stock then delivered. It shows whether options on this stock have usually been expensive or cheap in hindsight. | | **Put/call price** | The price of the nearest out-of-the-money put divided by the nearest out-of-the-money call. Above 1 means downside protection costs more than upside exposure at the nearest levels. | | **Realized %** | Recent actual moves: how much the stock has really been moving lately, scaled to the same period. Comparing it with the expected move shows whether options are pricing more or less movement than the stock has actually delivered. | | **Regime** | A one-word summary of the S&P 500's volatility mood: calm, normal, elevated, stressed or crisis. Most readings on this page mean something different in a calm market than in a stressed one. | | **S&P 3-month** | The same estimate for the S&P 500 over the next 3 months. It tracks Cboe's VIX3M within about 0.2 pts. Comparing it with the 30-day reading shows whether fear is concentrated right now or spread out. | | **S&P 30-day** | The options market's estimate of how much the S&P 500 will move over the next month, as a yearly percentage. 30 ≈ the S&P 500 priced for about ±1.9% a day. It's the size of the expected swing in the S&P 500, up or down — not a forecast of direction. About 68% of the time the index is expected to stay inside that range. | | **S&P 6-month** | The same estimate for the S&P 500 over the next 6 months. It runs about 1.3 pts below Cboe's VIX6M. The slowest-moving reading; it reflects the market's long-run comfort level. | | **S&P 9-day** | The same estimate for the S&P 500 over the next 9 days. It runs about 0.6 pts below Cboe's VIX9D. When it sits above the 30-day reading, the market is more worried about the next week than the month. | | **S&P next-day** | Implied vol for roughly the next 24 hours from S&P 500 options. Cboe's VIX1D measures the rest of the current trading day, so the two differ. It jumps ahead of known events such as a Fed decision or a jobs report. | | **Same-distance ratio** | The same put/call price ratio, but with both sides the same distance from the current price. It removes the accident of where the nearest levels happen to sit, so the comparison is fair. | | **Settling back** | Where today's SVX30 sits against this stock's usual range, and, when it was this high or this low before, how often it was back at its usual level within a month and how long that typically took. High volatility tends to fade; this shows how quickly it has for this stock. | | **Setups** | Conditions this stock has been in before — cheap or rich volatility, 2σ days, skew flipping to calls — and what the stock did in the weeks after each past time. It puts today in the context of this stock's own past, next to how often the same thing happens on any ordinary stretch. | | **Sigma** | Today's move so far, measured in expected moves (σ) priced at yesterday's close. +1σ means the stock is up exactly one expected move. It separates ordinary days (under 1σ, about 68% of days) from unusual ones (over 2σ, about 5% of days), however volatile the stock normally is. | | **Skew %ile 1y** | How today's skew compares with the past year: 90 means puts are richer versus calls than on 90% of days. It tells you whether demand for protection is unusual for this particular stock. | | **Skew 30d** | How much more (positive) or less (negative) protective puts cost than comparable calls over the next month, in volatility points. Positive and rising means investors are paying up for protection against a drop. | | **Skew flip** | Within the last 10 sessions, calls went from cheaper than puts to as rich as or richer than puts. A turn in which side of the options market is in demand often marks a change in mood for the stock. | | **Skylit Fear & Greed** | One 0-100 reading of the market's mood, built from what options are pricing, not headlines: 0 is extreme fear, 50 neutral, 100 extreme greed. Fear shows up in option prices first: protection gets expensive and swings get priced bigger. This puts all of that on one dial. | | **Smile** | Option prices across price levels for the roughly 1-month expiration, shown as implied volatility, next to their expected shape. Levels priced well above the expected shape are where traders are paying extra. | | **Spot** | The stock's latest price. Dollar expected moves are measured from this price. | | **Spot–vol link** | Whether SVX30 has tended to rise when the stock falls (the usual pattern) or rise when the stock rises, over the last 60 sessions. The link runs from −1 to +1. When volatility rises with the price, rallies can feed on themselves — a pattern seen around short squeezes. | | **Straddle-implied 1σ %** | The one-sigma move implied by at-the-money options, as a percent of the stock price. A second read on the same expected move; when the two agree, the estimate is on firmer ground. | | **SVX %ile** | How today's reading for the chosen horizon compares with the same stock over the chosen lookback: 90 means higher than on 90% of days. Pick the horizon that matches how long you hold a position, and the lookback that matches how far back you want to compare. | | **SVX %ile 1y** | How today's SVX30 compares with the past year: 90 means it is higher than on 90% of days. It tells you whether options are expensive or cheap for this particular stock, which the raw number alone cannot. | | **SVX / S&P** | This stock's SVX30 divided by the S&P 500's 30-day reading, the market-wide fear gauge. 2.0 means options price this stock to move twice as much as the S&P 500. It shows how much more (or less) jumpy this stock is expected to be than the overall market right now. | | **SVX1D** | The same estimate for just the next trading day, stated as a yearly percentage so it lines up with SVX30. Hover it to see the move options price for the next session, in percent. When it sits well above SVX30, the market expects an unusually big move very soon, often around news or earnings. | | **SVX30** | SVX (Skylit Volatility Index): how much the options market expects this stock to move over the next month, as a yearly %. One reading for every stock, on the same scale. SVX 30 ≈ options pricing about ±1.9% on a typical day. Higher means bigger expected swings and pricier options. It's the size of the expected swing in the stock's price, up or down — not a forecast of direction, and not a change in the index itself. About 68% of the time the price is expected to stay inside that range. | | **SVX3M** | The same estimate over the next 3 months, as a yearly percentage. 30 means roughly ±8.7% a month. Longer readings change slowly and show the market's baseline expectation for this stock. | | **SVX6M** | The same estimate over the next 6 months, as a yearly percentage. The slowest-moving reading; a jump here means the market has changed its long-run view of the stock. | | **SVX9** | The same estimate over about the next two weeks, as a yearly percentage. 30 means roughly ±4.2% over a week. Comparing short and long readings shows whether traders expect turbulence now or later. | | **Tail-risk pricing** | How much extra investors pay for protection against a sudden large S&P 500 drop. It tracks Cboe's SKEW within about 2 pts. A high reading means crash protection is in demand, even when the 30-day reading looks calm. | | **Term 9-30** | The 9-day reading minus the 30-day reading. Above zero means the market expects more movement in the next week or so than over the month. Above zero (called backwardation) usually shows up around stress or an upcoming event; below zero is the normal, calm state. | | **Thin** | Fewer quotes than usual right now, so treat this as approximate. Numbers built on less trading are less reliable and can jump around. | | **Tilt** | How lopsided put and call prices are after allowing for the normal difference between them, in volatility points. Positive = puts rich, calls cheap. Normal skew is expected; tilt shows only the unusual part. | | **Tilt vs history** | How today's tilt compares with this stock's own past year, as a percentile. An extreme reading is rare for this stock, which is what makes it noteworthy. | | **Typical past move** | The middle-sized stock move after recent earnings reports, up or down. Comparing it with the priced move shows whether the market expects more or less drama than usual. | | **VIX futures curve** | Where traders are pricing the VIX for each coming month. An upward slope is the normal calm state; a downward slope means the market expects today's fear to fade. | | **Vol of vol** | How much the S&P 500's 30-day reading is itself expected to swing. It tracks Cboe's VVIX within about 0.6 pts. High readings mean traders expect fear to change quickly; very low readings can mean complacency. | | **VRP** | How much higher the options market's volatility estimate is than the stock's recent actual volatility, in volatility points. A large positive gap means options are priced well above what the stock has been delivering. | | **vs sector** | How much pricier (+) or cheaper (−) this stock's options are than its sector's today, in percentile points. Big gaps flag stock-specific stories. | | **vs usual** | How today's imbalance compares with this stock's own past, as a percentile; "new" while there is not enough history. An extreme reading is rare for this stock, which is what makes it noteworthy. | --- Source: https://www.skylit.ai/docs/guides/talon # Talon field guide > Ask about the chart or map you have open and get a short, sourced read of the options structure, flow and news. Find the levels that matter faster. The call stays yours. > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. Past behavior of any reading or setup does not guarantee future results. ## Why it matters Reading an options map takes time, and the question you have is usually simple: where does this stall, and what has to break for it to run? Talon is the AI analyst built into Skylit. You ask in plain English, or with a slash command, from any page. It answers from live Skylit data and the Skylit Academy. That data covers the Heatseeker gamma (GEX) and vanna (VEX) map, options flow, dark pool prints (large trades done off the public exchanges), company events and news. > **Info:** **In plain English.** The GEX/VEX map shows where options positions sit, strike by strike. Gamma exposure is about how those positions react when price moves. Vanna exposure is about how they react when implied volatility changes. Talon reads the map for you and tells you where the big strikes are. How it differs from a general chatbot: - **It sees your page.** The page you are on and the ticker in focus go with every message. On an NVDA chart, "what are the levels?" is a complete question. - **Numbers come from Skylit data, not from memory.** Levels, strikes, expiries, dates and prices are meant to come from a live read. Still check any level before you act on it (see [Good to know](#what-to-trust-today)). - **It does not make the call.** Talon lays out the structure: the levels it points to, the price that would prove the idea wrong, and the risk-to-reward between them. It will not tell you to buy, hold, exit or how much to size, even if you ask for those fields in a template. > **Note:** **Two things called Talon.** This guide covers the **Talon chat**, the analyst inside the app. A separate product shares the name: the **Talon scans** that Glitch, Skylit's founder, posts on his Substack. ## Where to find it Talon is the same everywhere: one conversation, one history, one set of settings. Move between these places mid-thought and nothing is lost. | You want | Go to | | --- | --- | | Talon beside any page | Press `Cmd` + `\` (Mac) or `Ctrl` + `\` (Windows). Or tap the round **Aegis** button (a robot icon) to open the side panel, then the **Talon** tab. | | Talon full screen, with a live chart and market tape | **TALON** in the sidebar (or the phone module picker), or go to `/talon`. Pro plan. | | Past conversations | **History** in the Talon toolbar. On a phone, the History control on the full page. | | Timeframe, effort, watchlist | The row under the message box (the composer). | | Prose or Concise answers, follow-up chips | The settings button in that same row, **Answers** tab. Or type `/concise` and `/suggest`. | | Learn Talon step by step | Academy: **Talon Prompt Guide**, then The Core Reads, Trading the Index and Futures, Trading Single Names, Finding Setups, Building the Trade, and **Talon: The Full Page**. | | Report a bad answer | Thumbs-down on the answer. Include the exact question, the page, the timeframe and what you expected. | On desktop the Aegis button sits bottom right, above the Support button. On a phone it sits on the right edge, around the middle. You can drag it somewhere else. ### Which plans include Talon | Plan | What you get | | --- | --- | | Pro | The **Talon** tab in the Aegis panel, every slash command, page reads, scans, flow, company and research answers, plus the full page at `/talon` and the **TALON** entry in the sidebar and phone module picker. | | Community, Initiate and free accounts | The Talon tab does not appear. | The first time you open Talon, you accept a short disclaimer. It says Talon is educational and not financial advice, it can be wrong, and every trading decision is yours. It shows again whenever that text changes. If you decline, Talon closes and asks again next time. ## Read it in 30 seconds 1. **Open it.** Press `Cmd` + `\` (Mac) or `Ctrl` + `\` (Windows), or tap the round Aegis button and pick **Talon**. 2. **Set the timeframe.** Pick **Scalp**, **Day**, **Swing** or **Position** under the composer. It decides which expirations Talon reads, so a scalp read and a position read of the same ticker can rightly disagree. 3. **Ask a pointed question.** "Where does this turn?" or "what has to break for this to run?" gets more than "give me the levels". 4. **Name the expiry on any strike question.** Ask whether the trade was bought or sold, not how big it was: "Is 600 being bought or sold for the Oct 17 expiry?" 5. **Push back.** If a number looks wrong, say so. Talon fetches the data again and shows its source instead of defending its last answer. > **Info:** **In plain English.** Options that expire this week and options that expire in three months are different books. A scalp read looks at the near ones, a position read at the far ones. Same stock, two maps, much like tomorrow's forecast and the season outlook can point different ways. ## How to use it ### Set the timeframe and effort **Why:** the same ticker has a different map for a 0DTE scalp (options that expire today) than for a three-month hold. Matching Talon to your holding period keeps the read relevant. **Where:** the row under the composer. 1. Tap the timeframe control and pick **Scalp**, **Day**, **Swing** or **Position**. The menu shows the days-to-expiry range each one reads. You can set one as your default; it is marked in the menu. 2. Tap the effort control and pick **Fast**, **Balanced** or **Deep**. 3. If you scan watchlists, tap the watchlist chip and pick the Atlas list a plain `/watchlist` should use. ![The timeframe menu under the composer: Scalp, Day, Swing and Position, each with the days to expiry it reads.](https://www.skylit.ai/docs/images/guides/talon/timeframe.light.webp) | Effort | What the app says | When to use it | | --- | --- | --- | | **Fast** | "Quickest replies, lighter reasoning" | Quick lookups. | | **Balanced** | "Default. Full depth at chat speed" | Most questions. | | **Deep** | "Hardest reads. Slower, more headroom" (marked `$$$`) | Questions that chain several reads: confluence (several levels lining up), a full trade map, a rotation scan. The Academy suggests Deep for these. | ### Choose how answers look **Why:** sometimes you want the reasoning, sometimes you want to compare ten names at a glance. **Where:** the settings button in the composer row, **Answers** tab. 1. Under **Mode**, pick **Prose** (the default) to get the read in a few tight sentences, or **Concise** for the same read in short field blocks. Concise is better for comparing names and worse when you want the reasoning. `/concise` switches it from the composer. 2. Under **Follow-ups**, turn the three suggested next questions under each answer on or off. They are on by default. `/suggest` switches them. ![The Answers tab of Talon's settings: Mode (Prose or Concise) and Follow-ups (on or off).](https://www.skylit.ai/docs/images/guides/talon/answers-settings.light.webp) You can type your next question while Talon is still answering. Up to three questions wait in a queue and go out in order as each answer finishes. ### Slash commands **Why:** a command gets you exactly one read, with no guessing about what you meant. **Where:** type `/` in the composer to open the menu. 1. Type `/` and start typing the command name. The closest matches come first. 2. Pick the command, then add a ticker or scope if it takes one. 3. Press Enter. Picking the last option in a command runs it straight away. ![The command menu that opens when you type / in the composer.](https://www.skylit.ai/docs/images/guides/talon/slash.light.webp) Most commands behave like ordinary questions, so "what's the flow in NVDA?" gets the same answer as `/flow NVDA`. `/watchlist`, `/trinity` and `/talon TICKER` always run the same fixed read, so type those when you want exactly that read. | Command | What you get | | --- | --- | | `/levels [TICKER]` | The key GEX/VEX levels, each labeled with its instrument. A ticker you type beats the page. | | `/talon [TICKER]` (Talon Read) | A structure read on one name: the trade map with its reference levels, invalidation and risk-to-reward. | | `/talon sector NAME` · `theme NAME` · `market` · `universe` | The same scan across a group of names. The lists are below the table. | | `/watchlist [LIST]` | Scans one of your Atlas watchlists. With no name it uses Favorites, or your first saved list. | | `/trinity` | SPXW, SPY and QQQ read together, and whether they agree. | | `/breadth` | Advancers vs decliners across the S&P 500 and Nasdaq 100. | | `/flow [TICKER]` | Today's single-leg flow (one contract traded on its own, not part of a spread), how today compares with the week, and the premium leaders with their buy/sell split. | | `/darkpool [TICKER]` | Off-exchange block prints over the last five sessions. | | `/metrics [TICKER]` | Put/call ratio and max pain (the strike where the most option value would expire worthless). | | `/earnings [TICKER]` | Next and most recent earnings dates. | | `/market` | Market-wide tape and top tickers. | | `/news TOPIC` | Up to five recent articles, each with publisher and time. Takes free text, not a ticker. | | `/clear` · `/help` · `/concise` · `/suggest` | Start fresh, list commands, switch Concise, switch follow-up chips. | What you can scan with `/talon`: - **Sectors:** semiconductors ("semis" works), energy, financials, healthcare, consumer, industrials, cybersecurity, crypto. - **Themes:** mag7, ai, china, memory, ev, datacenters, neoclouds, hyperscalers, defense, nuclear, quantum, robotics, space. - **`market`:** the index, ETF and volatility group. - **`universe`:** the whole market. You can narrow it to stocks or ETFs. ### Find stacked kings **Why:** when a name's biggest gamma node and its biggest vanna node sit on the same strike and expiry, that one level carries both kinds of dealer exposure at once. Stacked kings find those levels across a whole list in one ask, instead of checking names one at a time. **Where:** ask Talon in plain words, from any page. There is no command to remember. 1. Ask for them: "stacked kings across the market", "stacked kings in my favorites", "stacked kings in semis", or "which of NVDA, AMD and PLTR have their kings on the same strike?". 2. Narrow by sign if you like: "both positive", "both negative", or "one positive, one negative" (a split stack). 3. Slice further with any phrase from the table below. They combine, so "big stacks near spot, closest first" works. 4. Read the card. Tap a ticker to open its trade map, or use the suggested follow-ups to flip the sign or switch between your favorites and the whole market. | You say | What you get | | --- | --- | | "at least \$10M" · "big stacks only" | Only stacks where both kings are at least that size. | | "top 10%" · "top 1%" | Only the biggest stacks among everything that was scanned. | | "within 5% of spot" · "near spot" | Only nodes close to the current price. | | "above spot" · "below spot" | Only nodes on that side of price. | | "firm only" | Leaves out kings that could move between reads (see below). | | "closest first" · "firmest first" | Sorts by distance from price or by how firm the kings are, instead of by size. | | "top 10" | Shows that many rows. Every match is still counted. | | "same strike, any expiry" · "summed across expiries" | Matches the strike across expirations, or uses each strike's total exposure, instead of one exact node. | | "show all" | Includes the small stacks that are hidden by default. | How to read the card: - **Stack** says Positive (both kings positive), Negative (both negative) or Split (opposite signs). **Node** and **Expiry** show where they sit; every node is dated. **GEX** and **VEX** are each king's exposure. - **Detailed** adds **Size** (where the stack ranks among every stack in what you scanned; Top 1% is the biggest), **Lead** (how far each king is ahead of the next-biggest node) and **Runner-up** (the node that would take over). - A line under the table names any **contested** king: one that leads its runner-up by less than 10%. Those can move to the runner-up between reads, so an answer a few minutes later can differ. That means the king moved, not that the first answer was wrong. - By default a stack only counts when both kings are at least \$1M. The smaller ones are counted under the table, not listed. - It reads the **whole map, every expiry**, even when your timeframe is Scalp or Day, and the card says so. To narrow it, say "short-dated only", "swing expiries" or name an expiry date. - On a phone, **Cards** or **Compact** show the whole stack without scrolling sideways. > **Info:** **In plain English.** Every name has a biggest gamma level and a biggest vanna level. Most of the time they are at different prices. A stacked king is when they land on the same spot, so one level is carrying most of both. It describes where exposure is concentrated. It does not say which way price will go. ### Ask about the page you are on **Why:** you do not have to retype the ticker or describe the chart. Talon already knows what you are looking at. **Where:** open Talon on any of the pages below. Its first line says what it can see. 1. Open the page, then open Talon. 2. Ask one of the questions in the **Try** column, or your own. 3. To ask about another ticker, just name it. A ticker you name always wins over the page. ![Talon open beside the SPY heatmap. Its first line says what it can see: the GEX/VEX map, a structured read and velocity.](https://www.skylit.ai/docs/images/guides/talon/page-context.light.webp) | Page | Talon starts from | Try | | --- | --- | --- | | Heatseeker | The GEX/VEX map, a structured read, velocity | "What's the read?" · "What changed in 5m?" | | Atlas | The chart's structure, levels and velocity | "Where is the king node?" · "What is on my chart?" | | Trinity | SPXW, SPY and QQQ side by side | "Is the system aligned?" · "Which index is the laggard?" | | Live feed · Scanner | Your active filters and what printed through them | "What am I filtering for?" · "Any repeat names?" | | Contract lookup · a contract chart | One ticker's busiest contracts; the contract on screen | "Bought or sold?" · "Is open interest building?" | | Compass | The panes on the board | "Which industries are bid?" | | Company events | Earnings, dividends, splits, insider and Congress filings | "When is the next report?" | | Tracker · Alerts | Saved positions; your alert rules and last fires | "Which are still open?" · "Why did this not fire?" | | Academy | The course you are reading | "Summarize this lesson" | On the **Heatseeker** and **Trinity map** pages Talon keeps its answers quick. Raw prints, the rotation scan, and chart patterns and indicators are not available there. Ask for those from Atlas or another page. ### Tap a ticker, read the cards **Why:** every ticker in an answer is a shortcut, and cards put a whole structure read on one screen. **Where:** inside any Talon answer. 1. **Tap a ticker** in an answer to open its menu. From there you can: - ask Talon about it: Talon Read, Levels, Flow, Dark pool, Metrics, Earnings, or Mention in composer - open it in Heatmap, Atlas or Trinity - favorite it, or add it to your selected watchlist 2. **Read the card.** A trade map, a scan report or a Trinity ladder shows as a card in place of text. Its numbers come from the same data as the answer. Scan cards line up the structural invalidation, the entry reference and the levels the structure points to. Each level shows its expiry and risk-to-reward. Each name shows its price and day change as of the moment the result loaded. 3. **Change the view.** On scan results and trade maps, use **Detail** (Compact, Normal or Detailed) and **Layout** (Fit, Scrollable or Cards). These only change how the result looks; nothing is read again. When a single name reports earnings within seven days either side of the data's date, Talon adds a line saying so. > **Info:** **In plain English.** A trade map is a route plan drawn from the options structure. It has a reference price, a few places price could travel to, and the price that would prove the idea wrong (the structural invalidation). Risk-to-reward weighs those levels against that invalidation. It describes the structure; it does not say whether to take the trip. ### History and feedback **Why:** pick up yesterday's thread without starting over, and tell Skylit when an answer misses. **Where:** **History** in the Talon toolbar; the thumbs under each answer. 1. Open **History** to search, pin, rename or delete conversations. 2. Tap **Continue** on a past thread to pick it up with its context. Old threads show how old they are. Continue one to keep the conversation, but ask again when you need fresh numbers. 3. Rate any answer with a thumbs up or down. A thumbs-down offers reasons (Inaccurate, Wrong levels, Too slow, Not what I asked, Other) and goes straight to the people who tune Talon. ### The full page (`/talon`) **Why:** a bigger workspace, with a live chart of whatever you are discussing next to the conversation. **Where:** **TALON** in the sidebar, or `/talon`. Pro plan. 1. **Read the tape** across the top: SPX, SPY, QQQ and CVIX (the VX-futures continuous index, not spot VIX). Switch the sparklines between **1H**, **4H**, **Today** and **2D**. 2. **Ask about a ticker.** On desktop, the **canvas** on the right shows a live chart of that symbol, plus the trade map, scan report, Trinity ladder or market overview. It holds up to six cards. A new ticker clears the board, and a seventh card pushes out the oldest. A question that names no ticker clears nothing. 3. **Use the chart.** It follows your Atlas chart preferences but never changes them. It is always live, even in an old conversation; the caption then reads "live · from a conversation" and how long ago. Tap **Open in Atlas** to take the symbol to your charts. When an answer has levels that can be drawn accurately, a chip offers to mark them on the chart. 4. **Arrange the panes.** The **Canvas** button in the header opens and closes the canvas, and the swap button beside it flips the panes. Drag the divider to resize; double-click it to reset. A narrow window shows one pane. ![The full Talon page: the market tape across the top, the conversation on the left and the canvas on the right.](https://www.skylit.ai/docs/images/guides/talon/page.light.webp) On a phone the full page has its own Back, History and New controls, and you can zoom the transcript with two fingers. ### Common routines These are habits for using the tool, not tested trading signals. Pick the one closest to how you trade. #### Index scalps (0DTE SPX, SPY, QQQ) Set **Scalp**. Open with `/trinity` to see whether the three indexes agree, then `/levels SPXW`. Before leaning on a level, ask "is that level still fresh, or tested today?". That answer is sometimes unavailable. The Academy teaches that levels weaken with each tap; treat that as a rule of thumb, not a tested signal. For flow at a wall (a big strike on the map), name the expiry and ask whether it was bought or sold. #### Day trades Set **Day**. From a Heatseeker or Atlas page, ask "what's the read?" then "where does this turn?". Follow `/flow NVDA` with "is that unusual for this name?" to see volume against its average and open interest, not just raw premium. #### Swings Set **Swing**. Run `/watchlist` or `/talon sector semis` to see which names have structure, then `/talon NVDA` for the trade map. Round it out with "how does the sector look behind this name?", "when do they report?" and, for the invalidation, "what would change your mind?". #### Positions and single-name research Set **Position**. Ask what the company does, who its peers are, what trades with it, whether insiders have been buying, and whether anyone in Congress traded it. Research answers are written in words and cite their sources. Take your numbers from the reads, not from research answers. ## Use it with other Skylit tools | Tool | How Talon helps | | --- | --- | | **Heatseeker** | Ask on the heatmap page: "What's the read?", "Where is the king node?", "What changed in 5m?". Check any level against the map itself. | | **Atlas** | Talon reads the chart you have open: structure, levels and velocity. On the full page, mark its levels on the canvas chart or open the symbol in Atlas. | | **Trinity** | `/trinity` gives the three-index ladder as a card. Ask "which index is the laggard?" | | **Flowseeker** | `/flow`, strike flow and `/darkpool` answer from flow data. On the Live feed or Scanner, Talon reads your filters and results. | | **Academy** | Product questions are answered from the Academy with sources. The Talon series starts with the **Talon Prompt Guide** course. | ## Ask Talon Talon answers questions about itself and the rest of Skylit from the published Academy and docs, and cites them. If the docs do not cover something, it says so instead of guessing. | You want | Ask Talon | | --- | --- | | The command list | `/help` · "What commands do you have?" | | How a control works | "What does the timeframe setting change?" · "When should I use Deep?" | | A term | "What is a king node?" · "What is structural invalidation?" · "What is acceptance?" | | Stacked kings | "What is a stacked king?" · "Stacked kings in my favorites" · "Big stacks near spot, closest first" | | How to use a tool | "How do I use Atlas?" · "How do chart layouts work?" | | Where the line is | "Why won't you tell me whether to sell?" (it explains why it won't) | ## Good to know - **Check a level before you act on it.** Talon takes its numbers from live Skylit data, but not every kind of answer is checked against that data yet. Compare any level with the Heatseeker map or the Atlas chart it came from. - **Talon describes; it does not decide.** It will not give buy, hold, exit, size or pick answers. If an answer ever reads like a call, report it with a thumbs-down. - **An empty scan is a real answer.** Scans are strict, so "nothing qualifies" means nothing met the bar. The risk-to-reward on a trade map is a reference from the structure, not a win rate. - **Market-wide scans tell you how much they read.** Look at the **Scanned** line instead of assuming the scan saw every name. - **Flow totals are single-leg only.** They will not match the all-legs figures on the contract chart. Read direction from the buy/sell split, never from how big the premium is. - **Dark pool, earnings and news have fixed limits.** Dark pool covers the last five sessions. Earnings gives dates, not whether the report is before or after the bell. News covers about the last week, and each headline names its publisher. - **Research answers are words, not numbers to trade.** They cite their sources. How to read Skylit data comes only from Skylit's own docs, never the open web. - **Timeframe changes the answer.** Talon's king node comes from the expirations your timeframe selects, so it can differ from a map showing other expirations. Stacked kings are the exception: they read the whole map unless you ask for fewer expirations. - **A king can move between reads.** When two nodes are nearly the same size, the biggest one can change from one minute to the next. Stacked kings flag these as contested, so ask again for fresh numbers before you rely on one. - **Long lists are read in part.** A scan reads as many names as fit in its time and tells you how many it did not reach, grouped by reason. To read the rest, scan a shorter list or one sector. - **Limits.** If you hit Talon's usage limit you will see "You've reached Talon's usage limit for now. Try again a little later." If Talon is off for your account you will see "Talon isn't available on your account. Contact support if you think this is a mistake." ## What's new **September 2026** - **Every card shows all four horizons.** Trade map and scan cards now show all four horizons: Scalp, Day, Swing and Position. Switch one on a card or in the composer and every card on screen updates instantly. After the close, a Scalp read shows the next listed expiry instead of refusing. See [Set the timeframe and effort](#set-the-timeframe-and-effort). - **A bigger Hero card for one-ticker answers.** When you ask about one ticker, Talon's setup card now opens larger, with a Confluence tab showing flow, positioning, dark pool prints and other evidence behind the trade. Other trades collapse into buttons that still show their prices. See [Tap a ticker, read the cards](#tap-a-ticker-read-the-cards). - **Canvas chart draws Talon's levels automatically.** The chart on the /talon canvas now marks the levels Talon just described without you tapping anything, matches the same gamma or vanna reading behind the words, and widens its price range so every level stays in view. An optional flow view can be turned on beside it. See [The full page (`/talon`)](#the-full-page-talon). - **Tapping a card's ticker updates the chart, not Atlas.** On /talon, tapping a scan card's ticker now changes the chart shown above the conversation instead of leaving Talon for Atlas. The card's menu also has a Chart on canvas option that does the same. See [The full page (`/talon`)](#the-full-page-talon). - **Slash and @ menus no longer hide behind the chart.** On the full Talon page, the / command list and @ symbol list now always show in full, even when the chart sits above them in the conversation. See [Slash commands](#slash-commands). - **Trade map times now show Eastern time.** The trade map's timestamp at the bottom now reads in Eastern time, matching the close, instead of raw UTC with no offset. See [Tap a ticker, read the cards](#tap-a-ticker-read-the-cards). - **Esc closes the timeframe menu.** Pressing Esc while the timeframe menu is open now closes just the menu, like the effort, watchlist and appearance menus beside it. Press it again to close the panel. See [Set the timeframe and effort](#set-the-timeframe-and-effort). - **Slash-command list names match more easily.** Typing a saved list's name in the / menu, like /watchlist Noah's, now finds it regardless of quote style, spacing or capitalization. See [Slash commands](#slash-commands). - **Queue a question while Talon answers.** You can send your next question while Talon is still answering. Up to three wait in a queue, so you never wait to type. See [Choose how answers look](#choose-how-answers-look). - **Steadier Talon on phones.** On a phone, the composer and slash menu stay above the keyboard, and the conversation no longer jumps while you scroll. See [How to use it](#section-by-section). - **Detail and Layout on scan results.** Scan results and trade maps have separate Detail and Layout controls, so you can make a result denser or roomier without a new read. See [Tap a ticker, read the cards](#tap-a-ticker-read-the-cards). - **Clearer scan cards.** Scan cards show the invalidation, entry reference and the levels the structure points to on one line, with each level's expiry and risk-to-reward, so the structure reads at a glance. See [Tap a ticker, read the cards](#tap-a-ticker-read-the-cards). - **Market breadth with /breadth.** /breadth shows how many S&P 500 and Nasdaq 100 names are advancing versus declining, so you can see whether a move is broad or narrow. See [Slash commands](#slash-commands). - **Live chart on the full page.** The /talon canvas shows a live chart of the symbol you are discussing, in your Atlas chart style, so price sits beside the answer. See [The full page (`/talon`)](#the-full-page-talon). - **Insider and Congress filings.** You can ask whether insiders have traded a stock, or whether members of Congress traded it, including on Company events. See [Ask about the page you are on](#ask-about-the-page-you-are-on). Every Talon update: [skylit.ai/changelog/talon](https://www.skylit.ai/changelog/talon). ## Glossary | Term | Meaning | | --- | --- | | **0DTE** | Options that expire today (zero days to expiry). | | **Aegis** | The Companion panel on the right of the app. Talon is one of its tabs. | | **Canvas** | The right pane of the full page, where the live chart and cards land. | | **Card** | A trade map, scan report or Trinity ladder shown as a block instead of text. Its numbers come from the same data as the answer. | | **Composer** | The message box where you type to Talon, with the timeframe, effort and watchlist controls under it. | | **Concise** | An answer format of short field blocks instead of prose. Switch it with `/concise`. | | **Continue** | Pick up a past conversation from History with its context. | | **Deep / Balanced / Fast** | Effort levels: how much reasoning Talon spends on an answer. Balanced is the default. | | **Scan report** | The card for a sector, theme, market or watchlist scan. | | **Fresh / tested / delivered / spent** | Where a level sits in its life, as the Academy teaches it: levels weaken with each tap (a Skylit rule of thumb, not a tested signal). | | **Contested king** | A king that is less than 10% bigger than the next node, so it can switch to that node between reads. | | **King node** | The dominant node (a strike with a large exposure) on the board. Talon reads the expirations your timeframe selects, so its King can differ from the one on a map showing other expirations. | | **Scanned line** | The line in a scan result saying how many names were actually read. | | **Stacked king** | A name whose biggest gamma node and biggest vanna node sit on the same strike and expiry. Positive, negative or split describes the two signs. | | **Structural invalidation** | The price that would prove the structural idea wrong, used as the reference for risk-to-reward. It is not a stop order. | | **Talon Read** | The `/talon` command: a structure read on one ticker or a scan across a scope. | | **Timeframe** | Scalp, Day, Swing or Position: which expirations Talon reads structure from. | | **Trade map** | One ticker's structure laid out with an entry reference, the levels the structure points to, the invalidation and risk-to-reward. A reference, not a recommendation. | | **Trinity** | SPXW, SPY and QQQ read together. | | **Wall** | A big strike on the map. Traders watch walls as places where price may stall. | --- Source: https://www.skylit.ai/docs/core-concepts # Core Concepts > The ideas behind reading a Heatseeker map: nodes, King and Gatekeeper nodes, midpoints, retests, rate of change and more. > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. Past behavior of any reading or setup does not guarantee future results. ### Nodes **Heatseeker™** is built to reveal **dealer exposure** at each strike price and expiration.\ Each strike displays a **value** (positive or negative), and each value is represented by a **color**: | Exposure Type | Color Range | Typical Behavior | | --------------------- | -------------- | ----------------------------------- | | **Positive Exposure** | Green → Yellow | Lower-volatility interaction | | **Negative Exposure** | Blue → Purple | Higher-volatility, “wicky” movement | #### Key Principle The most important factor is **not** whether a node is positive or negative — nor its color.\ What truly matters is the **absolute value** of the node. > The **larger** the absolute value, the **stronger** the pull it exerts on price. #### How Price Interacts with Each Node * **Positive Node →** Lower-volatility interaction; price tends to move **smoothly**, with fewer wicks or spikes. * **Negative Node →** Higher-volatility interaction; price becomes **wicky** and more **violent**.\ When price interacts with a **negative gamma node**, it can **overshoot** before reversing, which can catch traders on the wrong side of the move. ### Concept of Magnets Every node on the Heatseeker map acts like a **magnet** in the market.\ Price is **attracted** to these zones due to dealer positioning — yet these same areas can also act as **walls** that repel price and create reversals. #### Magnetic Behavior * As price **moves farther away** from a high-value node → the **magnetic pull weakens**. * As price **approaches** a high-value node → the **magnetic pull strengthens**. * When price **directly interacts** with a node, a **deflection or repulsion** may occur — similar to when two positive ends of a magnet meet and push apart. ![Heatseeker map: Magnetic Behavior, Core Concepts](https://www.skylit.ai/docs/images/X4bu2hHk5ZrCTbxeAlGL.webp) > Think of nodes as **dynamic magnets** — their influence grows as price converges and fades as it diverges. ### King Nodes **King Nodes** are the **highest absolute value nodes** on the heatmap.\ They represent where **Market Makers (MMs)** hold the **greatest exposure** — and where price often **gravitates near expiration**. ![Heatseeker map: King Nodes, Core Concepts](https://www.skylit.ai/docs/images/sYf7AGHqoZ9tBlKG67oi.webp) #### Key Characteristics * There can be **multiple significant nodes** with large values. * When multiple strong nodes exist, they can **pull in opposite directions**, creating **range-bound pinning** or **whipsaw movement**. #### Price Behavior Around King Nodes 1. **Pin Jobs (Common near End of Day)**\ MMs often pin price near the King Node late in the session. * Tight ranges form. * Traders often watch the **edges of the range**. ![Heatseeker map: Price Behavior Around King Nodes, Core Concepts](https://www.skylit.ai/docs/images/EpUMB66g2huxfsc33DQC.webp) 2. **Drives Away (Common early in the day)**\ When price reaches the King Node **too early**, MMs may push it away.\ Holding price there all session would require constant defense, so they often trigger an early **drive-off**. ![Heatseeker map: Price Behavior Around King Nodes, Core Concepts](https://www.skylit.ai/docs/images/MptX1Ms26wU8XycbxmoR.webp) #### Margin of Interaction King Nodes don’t always reject **to the exact cent**.\ Expect a **deflection margin** of roughly **5–10 points on SPX**. > Note: In the example above, the rejection came about 5½ points from the King Node and still counts as a reaction to it. ### Gatekeeper Nodes **Gatekeeper Nodes** act like **bouncers at the door of a nightclub** — they prevent price from easily reaching the King Node. These nodes function as **deflection points** that can cause major directional shifts. ![Heatseeker map: Gatekeeper Nodes, Core Concepts](https://www.skylit.ai/docs/images/upwoGJossFLgTEYnyxpJ.webp) #### Behavior * If price **tests and fails** at a Gatekeeper Node → the map can **reshuffle**. * **Reshuffles** often precede a **trend change** or **realignment** of where dealers aim to pin price. * Gatekeeper rejections near the **start of the day** are a common place traders watch for reversals. > After a rejection, the map often reshuffles, and the new layout shows where positioning is leaning next. ### Midpoints **Midpoints** sit between the edges of a range. Direction there is the least clear, which makes them a poor spot for directional risk-to-reward. * Option and spread sellers read midpoints differently from directional traders. ![Heatseeker map: Midpoints, Core Concepts](https://www.skylit.ai/docs/images/wbm7WmEhJLPQaSIyqlV9.webp) #### Why Midpoints Are Dangerous * Dealers are often comfortable in **range-bound** conditions. * The **upper and lower ranges** are easily visible on the heatmap. * When price is **in the middle of the range**, direction becomes **uncertain**. From the middle of a range, the distance to either edge is similar, so the **risk-to-reward** is roughly **1:1** rather than asymmetric. > ***What many traders watch instead: price approaching the edge of the range, where the risk is easier to define.*** ![Heatseeker map: Why Midpoints Are Dangerous, Core Concepts](https://www.skylit.ai/docs/images/qNWj5uIKynTCaBRsOYTZ.webp) ### Price Delivery & Node Retests When looking for **bounce plays** off a node, **context matters** — not all nodes retain influence forever. #### Node Retest Strength | Touch | Typical reaction | Notes | | ------------------ | ----------------- | ---------------------------------------- | | **First Touch** | Strongest | Fresh level; dealers tend to defend it hardest | | **Second Touch** | Weaker | Often forms double tops/bottoms | | **Third+ Touches** | Weakest | The level is less likely to hold | If price has already been **delivered from** a node (touched and moved away), its **influence weakens**.\ Each additional test reduces the likelihood of a strong bounce. ![Heatseeker map: Node Retest Strength, Core Concepts](https://www.skylit.ai/docs/images/qLLoJh0AzFwuvTz4gtEM.webp) * *Caption: ACN 240 node test, targeting upside nodes, from September 10th, 2025.* > **Key Takeaway:**\ > **Untouched nodes** tend to react more strongly than ones that have already been tested. ### Price Delivery From a Node When price bounces off a Gatekeeper node or King node, we don't always get reversion back to that specific node! * A node that has been interacted with tends to have less influence over price action, because the node is no longer "fresh". * A return to that node becomes less likely. ![Heatseeker map: Price Delivery From a Node, Core Concepts](https://www.skylit.ai/docs/images/peiie1TveeK5dwCLiqSs.webp) ***Key note: a node that has already been interacted with tends to matter less than a fresh one, which is why many traders focus on the freshest levels.*** ### Price Delivery and Node Size * If price gets a rejection (in a bearish scenario) or a bounce (in a bullish scenario) off a node, a few things may occur: * Gradual decrease of the node we were delivered from - in this case, the likelihood of a return back to the node in question becomes low probability. *PEP Price Delivery Case Study From October 15th, 2025 at 09:30am EST* ![Heatseeker map: Price Delivery and Node Size, Core Concepts](https://www.skylit.ai/docs/images/r723vFxiWf03PcgDdUV3.webp) * Increase of the node we were delivered from - higher likelihood of a reversion back to the node in question. *By keeping an eye on key nodes for rate of change, we can make inferences as to whether a reversion back to a deflection node is likely. Looking for increase in size of node gives us higher likelihood for price to return, whereas a decrease in node size gives us lower likelihood for reversion.* ### Power Hour Liquidations In the last half hour before the close, some brokers **auto-liquidate** accounts that fail margin requirements.\ That can create **forced order flow** in highly liquid names like **SPX, SPY and QQQ**. ![Heatseeker map: Power Hour Liquidations, Core Concepts](https://www.skylit.ai/docs/images/ajXHoQmbL5aZabcIOmIk.webp) #### Why It Matters * Can trigger **volatility spikes** right before the close. * Can **force breakouts or fakeouts** near Gatekeeper Nodes. * Near a **King Node**, can **accelerate** the move. * Sometimes reshuffles the entire map. > Power Hour moves are often mechanical (forced selling) rather than a change in view. ### Rate of Change of a Node Heatseeker™ not only shows **dealer positioning**, but also **how fast liquidity changes**. #### Reading Node Momentum * **Rapid Accumulation →** Dealers are quickly adding exposure; acts like a **magnet** that pulls price in strongly. * **Rapid Unwinding →** Exposure vanishes; levels that looked strong may suddenly **weaken**. * Fast changes often cause **volatility spikes**, **explosive moves**, or **sharp reversals**. ![](https://www.skylit.ai/docs/images/PCH2tuMunfa5tWOTvj52.webp)SPY 660 bounce from October 13th, 2025. QQQ had a strong floor below price and SPX was showing upside accumulation. *With QQQ holding its floor and SPX growing to the upside, two of the three Trinity maps leaned bullish. SPY's downside nodes then unwound quickly and price made a sharp, V-shaped recovery, an example of why traders watch nodes for rate of change.*" width={3355} height={1235} /> > Watch the **rate of change** — it reveals urgency and intent behind Market Maker adjustments. ### Rolling of Ceilings / Floors Another key concept in relation to node rate of change is the behavior in how rate of change occurs: * ***Rolling of ceilings*** - Considered strong presumptive evidence of a bearish thesis playing out. * Occurs when we see the upside ceiling and/or upside price targets decrease in value with the ceiling moving to a lower strike. * ***Rolling of floors*** - Considered strong presumptive evidence of a bullish thesis playing out. * Occurs when we see the downside floor and/or downside price targets decrease in value with the floor moving to a higher strike. ![Heatseeker map: Rolling of Ceilings / Floors, Core Concepts](https://www.skylit.ai/docs/images/rUAkBFIjBQb5k7gZTMOD.webp) ### Hedge Nodes **Hedge Nodes** appear during **major news or macro events** — such as FOMC, CPI, JOLTS, NFP, or earnings.\ They represent **large, protective positions** that sit **farther from price** and move **slowly** throughout the day. ![Heatseeker map: Hedge Nodes, Core Concepts](https://www.skylit.ai/docs/images/3xyQFQFDCq7aYqCgvMhx.webp) #### Characteristics * Typically **static or slow-unwinding**. * Can appear **above and below price** simultaneously, typically far away from current spot price. * Function like **insurance** rather than active magnets. The **closer** a Hedge Node is to current price, the **more it shapes intraday behavior**.\ The **farther** it is, the **less influence** it exerts. > Watch for **gradual unwinds** of large hedge nodes — they often signal changing Market Maker expectations. ### Air Pockets Air Pockets occur when maps show a zone of low volume and/or small sized nodes that price can move easily through due to the lack of resistance/activity within that zone. ![Heatseeker map: Air Pockets, Core Concepts](https://www.skylit.ai/docs/images/ZyhG1rCjXZDHPcCnoVYZ.webp) * The quality of the nodes (negative gamma vs positive gamma) can affect how sharp a move price can have. * If price action is moving through a negative gamma air pocket region, the moves can be much more violent / sharp. * If price action is moving through a positive gamma air pocket region, the moves can be much more mild / slow. ![Heatseeker map: Air Pockets, Core Concepts](https://www.skylit.ai/docs/images/gTXR8R1CducHHN8VhOm6.webp) Context matters - technical analysis and confluence among the other heatmaps (in trinity mode) can affect the ability for price to move through an air pocket. * ***An air pocket does not mean price will move through it. It is one input to weigh alongside the other Trinity maps.*** ### OPEX Nodes Monthly options expire on the **third Friday** of the month. The week leading into it is **OPEX Week**. #### What Happens During OPEX * Nodes may carry **less weight**, since many contracts are set to **expire**. * Positions roll off or reset, leading to **temporary distortions** in dealer positioning. * After OPEX week passes, the map often becomes **clearer**. > Read OPEX week levels with caution: positioning is temporarily distorted. *** **In Summary:** * Focus on **absolute value** — not color or sign. * **Untouched nodes** tend to matter more than retested ones. * **Rate of change** gives clues on momentum. * **Midpoints** are the least clear part of a range; **gatekeepers** and **king nodes** shape where price goes next. * Be mindful of **external catalysts** like **Power Hour**, **OPEX**, and **Hedge Nodes**. --- Source: https://www.skylit.ai/docs/examples-and-case-studies # Examples & Case Studies > Past sessions read through Heatseeker: what the map showed, and what happened next. > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. These are past examples chosen to illustrate a reading; they are not typical results, and past behavior of any setup does not guarantee future results. ### ***TSLA deflection off the king node, October 2nd, 2025:*** * Deflections off gatekeeper and king nodes are one of the setups traders watch most closely, because the level that defines the risk is clear. In the case of TSLA at the open, a few things happened: * TSLA gapped up at the open. * TSLA hit the 470 king node. * There was no upside accumulation on the deflection. * Downside nodes began accumulating at 467 and 462, as well as 450. * *Q: Where does the map point after a deflection like this?* * *A: Watching the rate of change of nodes during a map reshuffle shows where dealers are repositioning. In this case, floors were growing at 460 and 450.* ![Heatseeker map: TSLA deflection off the king node, October 2nd, 2025, Examples & Case Studies](https://www.skylit.ai/docs/images/YfKERLC8jpfnwhCtOKif.webp) *TSLA had a large run-up before the October 2nd flush. In that context, the map suggested waiting for a key pivot to be tested rather than reading every pullback as a turn. Reversal readings depend on the deflection actually happening at the level.* ### SPX rejection at the 6750 ceiling, October 9th, 2025: * SPX showed major nodes to the downside very early in the day, marking a significant area of interest. ***The first warning sign of a rug came when those downside nodes appeared and grew significantly.*** 6750 was tested and rejected, which also lined up with a bearish golden pocket. ![Heatseeker map: SPX rejection at the 6750 ceiling, October 9th, 2025, Examples & Case Studies](https://www.skylit.ai/docs/images/JGF2dFnSVPQRxs15Vl6R.webp) * SPY rejected its king node at 673, the second warning sign for downside (the SPX downside nodes were the first), while ***floors were beginning to grow at 670***. The map pointed to two areas of interest: the rejection at 673 and the growing floor at 670. ![Heatseeker map: SPX rejection at the 6750 ceiling, October 9th, 2025, Examples & Case Studies](https://www.skylit.ai/docs/images/BGBaFN62lfwDCuFZVDKA.webp) * QQQ told a similar story: the 611 gatekeeper node was tapped and rejected ***while 607 and 605 grew***, and the king node sat to the downside. ![Heatseeker map: SPX rejection at the 6750 ceiling, October 9th, 2025, Examples & Case Studies](https://www.skylit.ai/docs/images/ezu7xyzhLSuLBrKapTti.webp) ***SPX reached 6715, SPY reached 670 and QQQ came within 50 cents of 607.*** * ***SPY then bounced off the 670 floor almost to the cent.*** ### NFLX at the 1090 floor, Thursday, October 30th, 2025 On Wednesday at the close, NFLX was approaching a strong floor at 1090, in line with a key support level. * *There were few downside nodes below that level, so the floor was the clear level to watch.* ![Heatseeker map: NFLX at the 1090 floor, Thursday, October 30th, 2025, Examples & Case Studies](https://www.skylit.ai/docs/images/O1FTVC1oGgY3HDJqjEwr.webp) * ***VEX showed a stair step up, with upside accumulation in the weeks ahead.*** ![Heatseeker map: NFLX at the 1090 floor, Thursday, October 30th, 2025, Examples & Case Studies](https://www.skylit.ai/docs/images/gVyjgLJHrNxCoUmhhUpd.webp) **The reading depended on 1090 holding and on continued upside growth. If the floor broke, the reading was invalid.** * **On Friday, NFLX opened with a gap up after announcing a 10:1 stock split.** News like this is outside what the map can show. ![Heatseeker map: NFLX at the 1090 floor, Thursday, October 30th, 2025, Examples & Case Studies](https://www.skylit.ai/docs/images/qPTgmPbZcM4UpduoCKek.png) --- Source: https://www.skylit.ai/docs/patternpedia/pattern-the-whipsaw # PATTERN: The Whipsaw > Price trades in a wide range, the edges of which are defined by the presence of at least two high value nodes with few prominent nodes in between. > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. These are past examples chosen to illustrate a reading; they are not typical results, and past behavior of any setup does not guarantee future results. ## DESCRIPTION Price trades in a wide range, the edges of which are defined by the presence of at least two high value nodes with few prominent nodes in between. ## HOW TO APPROACH A Whipsaw reads like a range: the edges are where the risk is easiest to define. The middle of the range is the least clear, and with 0DTE options, theta decay and unstable price action can erode premium quickly there. ### Example 1 ![Heatseeker map: HOW TO APPROACH, PATTERN: The Whipsaw](https://www.skylit.ai/docs/images/5bzoREtWnLNE534wgWnU.png) Price is oscillating between the 6650 and 6675 strikes. (09/24/25) ### Example 2 ![Heatseeker map: HOW TO APPROACH, PATTERN: The Whipsaw](https://www.skylit.ai/docs/images/bJHXsK2kpRNOwjL3MBrX.png) Price is fluctuating in a loose range between 6545 and 6480. (09/09/25) ### Example 3 ![Heatseeker map: HOW TO APPROACH, PATTERN: The Whipsaw](https://www.skylit.ai/docs/images/iP49OgscI6OOHCcgbuLy.png) Price is oscillating between the 6480, 6460, and 6440 strikes. Note that in this example, there are four high value nodes of interest. (09/05/25) --- Source: https://www.skylit.ai/docs/patternpedia/pattern-rainbow-road # PATTERN: Rainbow Road > This heatmap is characterized by having multiple prominent nodes of positive and negative values, in many cases bearing a resemblance to a rainbow. Another… > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. These are past examples chosen to illustrate a reading; they are not typical results, and past behavior of any setup does not guarantee future results. ## DESCRIPTION This heatmap is characterized by having multiple prominent nodes of positive and negative values, in many cases bearing a resemblance to a rainbow. Another distinct feature of this heatmap is the lack of a clear range for price to trade within, heralding choppy and erratic price action. ## HOW TO APPROACH When positioning is this vague, the map offers little to lean on. Many traders treat it as a reason to stand aside until a clearer structure forms. ### Example 1 ![Heatseeker map: HOW TO APPROACH, PATTERN: Rainbow Road](https://www.skylit.ai/docs/images/1mLmPgxJw4whEwuUhGve.png) Indecisive positioning near the beginning of the session, with nodes of interest spread across an 80-point range. (07/02/25) ### Example 2 ![Heatseeker map: HOW TO APPROACH, PATTERN: Rainbow Road](https://www.skylit.ai/docs/images/Ihh33odYBSSF82qA1c6v.png) Multiple prominent purple nodes in the 641-637 range suggest choppy and erratic price action. (08/19/25) ### Example 3 ![Heatseeker map: HOW TO APPROACH, PATTERN: Rainbow Road](https://www.skylit.ai/docs/images/eHLvk5dntEECbfaFwqXW.png) A cluster of prominent nodes can be seen across a 100-point range. (08/07/25) --- Source: https://www.skylit.ai/docs/patternpedia/pattern-the-gatekeeper # PATTERN: The Gatekeeper > A Gatekeeper node is a commonly seen heatmap setup where a high-value node sits between price and further high-value nodes, preventing continuation. This… > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. These are past examples chosen to illustrate a reading; they are not typical results, and past behavior of any setup does not guarantee future results. ## DESCRIPTION A Gatekeeper node is a commonly seen heatmap setup where a high-value node sits between price and further high-value nodes, preventing continuation. This node then serves as a key support or resistance level. ## HOW TO APPROACH Many traders mark gatekeeper strikes on the chart, because price often stalls or reverses as it approaches them. A reversal at the gatekeeper is more likely to hold when the Gatekeeper node's value is far larger than the nodes beyond it. As always, price action and market structure matter as much as the map. ### Example 1 ![Heatseeker map: HOW TO APPROACH, PATTERN: The Gatekeeper](https://www.skylit.ai/docs/images/k1nPigyIgDc5wA0xifBN.webp) 6600, a key psychological level, "gatekeeps" price - currently at 6615- from trading into the further downside nodes. (10/10/25) ### Example 2 ![Heatseeker map: HOW TO APPROACH, PATTERN: The Gatekeeper](https://www.skylit.ai/docs/images/ctVeID1euuyFRQnOeeZo.webp) A supportive node at the 360 strike serves as a potential obstacle between spot and the ultimate target of 350. CVNA (10/08/25) ### Example 3 ![Heatseeker map: HOW TO APPROACH, PATTERN: The Gatekeeper](https://www.skylit.ai/docs/images/4yrq9E1woZW5E0Z15dY2.webp) SPY has a clear upside skew, but a distinct gatekeeper node at 664 stalls any movement to the upside. Compare the value of the gatekeeper node against the second highest-value node. (09/29/25) --- Source: https://www.skylit.ai/docs/patternpedia/case-study-speculative-and-decoy-nodes # CASE STUDY: SPECULATIVE AND DECOY NODES > How to read a large, far out-of-the-money node that may be speculative or a decoy rather than a realistic target. > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. These are past examples chosen to illustrate a reading; they are not typical results, and past behavior of any setup does not guarantee future results. On occasion, a heatmap may display a far out of the money (OTM) node that is likely to be speculative, or a decoy. In both cases, read the node with a high degree of skepticism and compare it with the chart to judge whether such a move is realistic. ## Netflix (NFLX) 1290 ![Heatseeker map: CASE STUDY: SPECULATIVE AND DECOY NODES](https://www.skylit.ai/docs/images/rSrfnbAzb5Xmf3QGWQGf.webp) This heatmap shows a distinct node at 1290, which is roughly 3 times the value of the 1232.5 gatekeeper node and a full 5.5% from where price was trading (1222). However, there are several things to consider before reading it as a target: 1\) Multiple gatekeeper nodes at 1232.5 and 1252.5 2\) There is a lack of prominent nodes to the upside for the next week over, reinforcing the impression that this node is more likely to be speculative or a decoy than a realistic price target. 3\) Price would have to run a full 5.5% within 4 trading sessions to reach the node, leaving almost no time for consolidation. With the presence of multiple gatekeeper nodes, buying momentum would have to be significant. ## Eli Lilly (LLY) ![Heatseeker map: CASE STUDY: SPECULATIVE AND DECOY NODES](https://www.skylit.ai/docs/images/uogv5I4yTg53J4BxQNGx.webp) LLY is another cautionary tale for speculative nodes. On 10/6/25, the heatmap for LLY showed a node of interest at the 10/10 900 strike with the highest absolute value out of any other node on the heatmap up until that point, implying 50 points of upside. However, we must first consider the context of how price arrived at 847. ![Heatseeker map: CASE STUDY: SPECULATIVE AND DECOY NODES](https://www.skylit.ai/docs/images/tdBPdoX92FJnpianx55z.webp) Price had already been delivered from the 710 strike in an almost vertical fashion, running almost 150 points in the past week with only two days of consolidation during that period. Another 50 points of upside within 4 days would have been a stretch after a run like that; a pause or another period of consolidation was at least as plausible. --- Source: https://www.skylit.ai/docs/patternpedia/pattern-trend # PATTERN: Trend > Price fixates on a king node far away from spot with comparatively small counter-directional skew. As it trades towards the initial king node, it then… > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. These are past examples chosen to illustrate a reading; they are not typical results, and past behavior of any setup does not guarantee future results. ## DESCRIPTION Price fixates on a king node far away from spot with comparatively small counter-directional skew. As it trades towards the initial king node, it then selects the node above it as the new king node. If price begins to trade away from the king node, observe the changes in the values around that node's strike. If the values of those nodes remain relatively unchanged or even increase, it suggests price may eventually trade back towards it. Mechanically, the nodes away from price tend to fade in value while the values in the direction of the trend increase in value. ## HOW TO APPROACH Trend days tend to stair-step, so pullbacks are where many traders look for the trend to resume, as long as price action and the heatmap still support it. Chasing price on a trend day makes the risk harder to define. ### Example 1 ![Heatseeker map: HOW TO APPROACH, PATTERN: Trend](https://www.skylit.ai/docs/images/3nxqKIK77OvKkU3JA0QO.png) Price trades downwards to the 6400 strike with few nodes of significance above spot to provide an opposing force. (08/19/25) ### Example 2 ![Heatseeker map: HOW TO APPROACH, PATTERN: Trend](https://www.skylit.ai/docs/images/Q6ZzL1pez7OensQSOmHj.png) The 6585/6580 strikes provide an upward skew. Price often slows as it approaches these dual strikes. (09/11/25) ### Example 3 ![Heatseeker map: HOW TO APPROACH, PATTERN: Trend](https://www.skylit.ai/docs/images/t7IoEhcJuuq1zmbqfbck.png) Price locks onto the 6430 strike as its initial target. We can observe a clear bullish skew as the absolute value of the 3 nodes above spot dwarf that of the 3 nodes below. (10/01/25) --- Source: https://www.skylit.ai/docs/patternpedia/pattern-rug-setup # PATTERN: RUG SETUP > A yellow node stacked above a purple node, with no obvious floor below: the rug setup. > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. These are past examples chosen to illustrate a reading; they are not typical results, and past behavior of any setup does not guarantee future results. ## DESCRIPTION When we have a yellow node stacked above a purple node with no obvious floor in sight, we can identify the setup as a rug setup. * Why? - The negative gamma ceiling can accelerate a rejection from the positive gamma ceiling, almost like "pouring gasoline on the fire". In the example below, the negative gamma floors at 670 and 669 could also accelerate a move down. ![Heatseeker map: DESCRIPTION, PATTERN: RUG SETUP](https://www.skylit.ai/docs/images/uFffBbtMXEzquH6PYgxS.webp) ## EXAMPLE: SPX/SPY/QQQ 10/7/25 * Early in the day, we noticed some pretty heavy sized nodes for next day expiration, likely hedge nodes. These heavy sized nodes could have some influence over price action today. * As the morning scramble began, I kept noticing SPX 6720 nodes growing gradually, with very little upside accumulation on all 3 indices. At this point the map leaned bearish. * no upside accumulating, downside growing. * ***SPX:*** * very little activity at the start of day, but we saw growth to the downside. * ***SPY:*** * had downside pressure at 672 / 671 nodes that continued accumulating, preventing price from grinding higher. * identified a rug pull setup developing, in which we have a yellow node stacked above a purple node. When the yellow node unwinds, reactions to the downside can be rapid and violent. * The negative gamma nodes below could also accelerate a drop, with no clear floor in sight. * ***QQQ:*** * Was sitting above its king node, with very little upside accumulation. * 608 / 606 remained lit up, so those were the nodes the map pointed to. The catalyst in this case was ***SPY's rug setup.*** The levels the map highlighted were the rejection of 6750 on SPX, the double top liquidity hunt on QQQ and the bearish golden pocket retracement on SPY, with key nodes to the downside. ![Heatseeker map: EXAMPLE: SPX/SPY/QQQ 10/7/25, PATTERN: RUG SETUP](https://www.skylit.ai/docs/images/pw1JiKFO8i5UEYRbl4iU.webp) --- Source: https://www.skylit.ai/docs/patternpedia/the-ten-commandments-of-using-heatseeker # The Ten Commandments of Using Heatseeker > Ten risk-management habits for reading Heatseeker with discipline. > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. Past behavior of any reading or setup does not guarantee future results. Ten habits the Skylit community repeats. They are about discipline and risk, not a trading system. 1. Thou shalt protect your existing capital at all costs. 2. Thou shalt look for reactions at floors or ceilings (not diddle in the middle) 3. Thou shalt know your risk and reward before you act 4. Thou shalt always consider where price was delivered from 5. Thou shalt be aware of the broader market 6. Thou shalt put technical analysis before utilizing Heatseeker 7. Thou shalt seek confluence between Heatseeker and Price Action 8. Thou shalt not oversize 9. Thou shalt not chase: let price come to the level 10. Thou shalt have a plan for protecting open gains. #### Above all, practice sound risk management and protect your profits. Recall these commandments regularly, even in the wake of a green day. The market will always find a way to humble you. --- Source: https://www.skylit.ai/docs/patternpedia/topping-patterns-bottoming-patterns # TOPPING PATTERNS / BOTTOMING PATTERNS > How VEX positioning can point to a potential higher-timeframe trend shift on the indices. > **Note:** Educational material, not financial advice. Nothing here is a recommendation to buy or sell any security. Options involve significant risk and are not suitable for every investor. These are past examples chosen to illustrate a reading; they are not typical results, and past behavior of any setup does not guarantee future results. ## Introduction: This is a guide on how to spot potential higher timeframe trend shifts on the indices. We'll be looking primarily at the VEX positioning rather than the GEX positioning, because it shows how dealers are positioned for the sessions ahead. ## **Bearish Positioning for the Week of 11/7/2025:** * VEX was looking toppy on SPY and QQQ. We can determine this because of a lack of accumulation to the upside nodes. * 685 SPY was a strong gatekeeper node with very minimal upside accumulation at 690. Price had been delivered from 690 a few days earlier, which made a return to 690 less likely. ![](https://www.skylit.ai/docs/images/bHQGECH6DeIaKVtmcBit.webp)11/3/2025 Pre market outlook on SPY: Price was delivered from 690 a few days prior, with a massive gatekeeper node at 685 preventing upside. " width={1360} height={1148} /> * QQQ had a similar outlook as SPY, with a king node at 635 and high accumulation into the next few days. Similar to SPY, we observed that same stair-stepping pattern. This is a significant confluence to consider. ![Heatseeker map: Bearish Positioning for the Week of 11/7/2025, TOPPING PATTERNS / BOTTOMING PATTERNS](https://www.skylit.ai/docs/images/FZ0uYJot5RkJXcUyjXNL.webp) ***Key point: when the indexes show little to no upside accumulation, it can be a sign of a potential "market top". Notice how on SPY we had multiple levels of resistance with no signs of continuation higher.*** ![](https://www.skylit.ai/docs/images/CL5bULV2qcD6G26cWzND.webp)SPY 690 was showing a hard wall, with a big gatekeeper node at 685. With very little upside accumulation, the nodes growing to the downside were where the map pointed. " width={1365} height={1090} /> ## Reading this bearish bias: VEX positioning shows how dealers are postured in the days ahead. With a bearish posture like this one, traders focus on how price reacts at node rejections. Keep in mind that maps can shuffle at a moment's notice, whether that's intraday or for the days ahead. An invalidation of this bias would simply be the opposite of how it was formed: higher accumulation at higher strikes, dissipation of values at lower strikes, and stronger positioning closer to the money. ## What happened next: In this case, SPY sold down to 661, with QQQ tapping its weekly low at 598, a nearly 3% move from peak to trough. ## Quiz: 1. Which of these shows how dealers are positioned? 1. An analyst report claiming that the indices are due for a pullback. 2. $5m in put options being bought on SPY 3. Stairstep VEX exposure to the downside, with comparatively little accumulation to the upside. 4. Your fib levels show that the market is overextended. **Answer:** 3. Stairstep VEX exposure. Dealer positioning is expressed through the Greeks. --- Source: https://www.skylit.ai/docs/help-page/general-information # General Information > Meet the Skylit team behind Heatseeker. **Skylit Team:** - **Glitch** — Heatseeker founder ([@Glitch_Trades](https://x.com/Glitch_Trades)) - **Giul** — approved analyst ([@Simply0DTE](https://x.com/Simply0DTE)) - **John Wicks** — success team member ([@The_John_Wicks](https://x.com/The_John_Wicks)) - **Nicog8** — success team member ([@nicog8_trading](https://x.com/nicog8_trading)) --- Source: https://www.skylit.ai/docs/help-page/written-guides # Written Guides > Written guides for Skylit: the field guides, the Heatseeker docs and Patternpedia. ## Field guides [Field guides](https://www.skylit.ai/docs/guides/overview) Plain-English guides to each Skylit module: Heatseeker, Flowseeker, Atlas, Nexus, Tempest (beta) and Talon. ## Skylit Docs [Skylit Docs](https://www.skylit.ai/docs/platform/overview)\ (written by John Wicks)\ \ Written introductions to Heatseeker and how to read it. ## Patternpedia [Patternpedia](https://www.skylit.ai/docs/patternpedia/pattern-the-whipsaw)\ (written by Warren and John Wicks)\ \ A summary of common patterns seen on heatmaps, plus a '10 commandments' list of risk-management habits. --- Source: https://www.skylit.ai/docs/help-page/video-links # Video Links > Skylit's official YouTube channel and videos from the Skylit team: onboarding, index trading, swing trading, Q\&A's and more. ## Skylit [https://www.youtube.com/@Skylit_AI](https://www.youtube.com/@Skylit_AI)\ \ The official Skylit channel. ## Glitch [https://www.youtube.com/@Glitch_SPX](https://www.youtube.com/@Glitch_SPX)\ \ Collection of livestreams created by Glitch for various topics including onboarding, index trading, swing trading, Q\&A's, and other topics. ## John Wicks [https://www.youtube.com/@The_John_Wicks](https://www.youtube.com/@The_John_Wicks)\ \ Collection of livestreams created by John Wicks for onboarding, Q\&A's and general market discussion. ## Nicog8 [https://www.youtube.com/@nicog8_trading](https://www.youtube.com/@nicog8_trading)\ \ Collection of livestreams, videos, and short form content created by Nicog8 for onboarding, charting sessions, trade recaps, and other topics. ## Garma [https://www.youtube.com/@garma_donM4](https://www.youtube.com/@garma_donM4)\ \ Videos from Garma, of the Skylit team. ## Giul [https://www.youtube.com/@giul_trades](https://www.youtube.com/@giul_trades)\ \ Videos from Giul, of the Skylit team. ## DixonQ [https://www.youtube.com/@r2q2](https://www.youtube.com/@r2q2)\ \ Collection of index timelapses for Heatseeker. --- Source: https://www.skylit.ai/docs/help-page/useful-threads # Useful Threads > These threads contain daily charts/plots showing overlay of heatmaps on charts. ## Heatseeker Visualizations These threads contain daily charts/plots showing overlay of heatmaps on charts.\ \ [https://discord.com/channels/1364590772468449400/1434667515761524757](https://discord.com/channels/1364590772468449400/1434667515761524757)\ (created by pckt)\ \ [https://discord.com/channels/1364590772468449400/1440811593079459921](https://discord.com/channels/1364590772468449400/1440811593079459921)\ (created by duckbin) ## Trade Recaps These threads contain futures, index and swing trade recaps posted by community members. Recaps are one trader's view of their own trades, not recommendations or typical results.\ \ [https://discord.com/channels/1364590772468449400/1405020206862176368](https://discord.com/channels/1364590772468449400/1405020206862176368)\ (kwonyoo - futures)\ \ [https://discord.com/channels/1364590772468449400/1434270363059228722](https://discord.com/channels/1364590772468449400/1434270363059228722)\ (John Wicks - futures/indexes)\ \ [https://discord.com/channels/1364590772468449400/1432223781493149716](https://discord.com/channels/1364590772468449400/1432223781493149716)\ (nicog8 - swings/indexes) ## Daily Replays Collection of index replays for Heatseeker, same link as shown in [Video Links](https://www.skylit.ai/docs/help-page/video-links). [https://discord.com/channels/1364590772468449400/1430678343350747287](https://discord.com/channels/1364590772468449400/1430678343350747287)\ (created by DixonQ) ## Community FAQ Collection of community questions answered by Glitch, Success Team, and analysts. First link is one channel and a lot to scroll through, second channel is a collection of threads so easier to find specific topics.\ \ [https://discord.com/channels/1364590772468449400/1364605561831817296](https://discord.com/channels/1364590772468449400/1364605561831817296)\ (single channel)\ \ [https://discord.com/channels/1364590772468449400/1376954903972417658](https://discord.com/channels/1364590772468449400/1376954903972417658)\ (collection of threads) --- Source: https://www.skylit.ai/docs/api-reference/heatmap/live-per-strike-heatmap-one-or-more-symbols # Live per-strike heatmap (one or more symbols) `GET https://api.skylit.ai/v1/heatmap` API: Heatseeker. Credits: 1. Current per-strike heatmap for one or more symbols at the latest snapshot. Includes the live `velocityPct` per strike. Pass multiple comma-separated symbols for a single cross-asset (Trinity) call, and `expirations` to net each strike over specific expiration dates instead of the nearest `maxExpirations`. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbols` | query | string | yes | One ticker, or a comma-separated list for a single cross-asset call (e.g. `SPY` or `SPY,SPX,QQQ`). Each is returned as an element of `data.symbols`. | | `metric` | query | string | no | Which Greek exposure to return per strike. (one of `gamma`, `vanna`; default `gamma`) | | `maxStrikes` | query | integer | no | Maximum number of strikes around spot to return. (default `92`; min 1; max 400) | | `maxExpirations` | query | integer | no | How many of the nearest expirations to net into each strike's `value`. Ignored when `expirations` is set. (default `5`; min 1; max 60) | | `expirations` | query | string | no | Net each strike over exactly these expirations (`YYYY-MM-DD`, comma-separated) — one for a single-expiration heatmap (`2026-05-22`) or several for a custom set (`2026-05-22,2026-06-19`). Supersedes `maxExpirations`, and reaches any expiration the snapshot has, not just the nearest ones. Requested dates the symbol does not have are ignored; the `expirations` array in the response lists what was actually used. If none of them match, the response is `404` with `code: expiration_not_found` and the available dates in the message. On `/v1/heatmap`, expirations that have already expired are not available (they are trimmed from the live snapshot) — replay them with `/v1/historical` instead. | | `layout` | query | string | no | `net` (default) returns one net value per strike. `matrix` also returns `matrix`, the per-expiration grid those values are summed from. (one of `net`, `matrix`; default `net`) | ## Example request ```bash curl "https://api.skylit.ai/v1/heatmap?symbols=SPY,SPX,QQQ" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Live heatmap snapshot(s). Headers: `Cache-Control`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`. SPY live (truncated): ```json { "data": { "symbols": [ { "symbol": "SPY", "asOf": "2026-05-22T14:31:00Z", "spot": 591.23, "previousClose": 589.1, "priceChange": 2.13, "priceChangePercent": 0.36, "expirations": [ "2026-05-22", "2026-05-23", "2026-05-30" ], "strikes": [ { "strike": 590, "value": 1894300.4, "nodeType": "king", "velocityPct": 12.4 }, { "strike": 595, "value": 642100.2, "nodeType": "gatekeeper", "velocityPct": -3.1 }, { "strike": 585, "value": 88010, "nodeType": "normal", "velocityPct": 0.4 } ] } ] }, "meta": { "metric": "gamma", "resolution": "1m", "mode": "live", "cached": false } } ``` SPY netted over one expiration (`expirations=2026-05-23`): ```json { "data": { "symbols": [ { "symbol": "SPY", "asOf": "2026-05-22T14:31:00Z", "spot": 591.23, "previousClose": 589.1, "priceChange": 2.13, "priceChangePercent": 0.36, "expirations": [ "2026-05-23" ], "strikes": [ { "strike": 590, "value": 412880.1, "nodeType": "king", "velocityPct": 8.2 }, { "strike": 595, "value": 121400.7, "nodeType": "gatekeeper", "velocityPct": -1.4 } ] } ] }, "meta": { "metric": "gamma", "resolution": "1m", "mode": "live", "cached": false } } ``` ### 400 Request validation failed. ### 401 Missing or invalid API key. ### 403 The API key is invalid, revoked or expired, or the account is suspended. ### 404 Unknown symbol, no data available, or none of the requested `expirations` exist for the symbol (`code: expiration_not_found`). ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. ### 503 Heatmap data is temporarily unavailable. --- Source: https://www.skylit.ai/docs/api-reference/heatmap/replay-per-strike-heatmap-at-a-past-instant-one-or-more-symbols # Replay per-strike heatmap at a past instant (one or more symbols) `GET https://api.skylit.ai/v1/historical` API: Heatseeker. Credits: 5. The snapshot nearest `at` for one or more symbols — same shape as `/v1/heatmap` minus `velocityPct` (velocity is live-only). `at` may be up to 365 days in the past; if no snapshot exists at/near that instant the response is `404` with `code: no_data`. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbols` | query | string | yes | One ticker, or a comma-separated list for a single cross-asset call (e.g. `SPY` or `SPY,SPX,QQQ`). Each is returned as an element of `data.symbols`. | | `at` | query | string (date-time) | yes | RFC3339 instant to replay (e.g. `2026-03-05T10:01:00Z`). Up to 365 days back. | | `metric` | query | string | no | Which Greek exposure to return per strike. (one of `gamma`, `vanna`; default `gamma`) | | `maxStrikes` | query | integer | no | Maximum number of strikes around spot to return. (default `92`; min 1; max 400) | | `maxExpirations` | query | integer | no | How many of the nearest expirations to net into each strike's `value`. Ignored when `expirations` is set. (default `5`; min 1; max 60) | | `expirations` | query | string | no | Net each strike over exactly these expirations (`YYYY-MM-DD`, comma-separated) — one for a single-expiration heatmap (`2026-05-22`) or several for a custom set (`2026-05-22,2026-06-19`). Supersedes `maxExpirations`, and reaches any expiration the snapshot has, not just the nearest ones. Requested dates the symbol does not have are ignored; the `expirations` array in the response lists what was actually used. If none of them match, the response is `404` with `code: expiration_not_found` and the available dates in the message. On `/v1/heatmap`, expirations that have already expired are not available (they are trimmed from the live snapshot) — replay them with `/v1/historical` instead. | ## Example request ```bash curl "https://api.skylit.ai/v1/historical?symbols=SPY,SPX,QQQ&at=" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Historical heatmap snapshot(s). Headers: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`. SPY at a past minute (truncated): ```json { "data": { "symbols": [ { "symbol": "SPY", "asOf": "2026-03-05T10:01:00Z", "spot": 512.4, "previousClose": 510.02, "priceChange": 2.38, "priceChangePercent": 0.47, "expirations": [ "2026-03-05", "2026-03-06" ], "strikes": [ { "strike": 512, "value": 1500200, "nodeType": "king" }, { "strike": 515, "value": 410000, "nodeType": "gatekeeper" } ] } ] }, "meta": { "metric": "gamma", "resolution": "1m", "mode": "historical", "cached": false } } ``` ### 400 Request validation failed. ### 401 Missing or invalid API key. ### 403 The API key is invalid, revoked or expired, or the account is suspended. ### 404 No snapshot at/near the requested instant, unknown symbol, or none of the requested `expirations` exist in that snapshot. noData: ```json { "error": { "code": "no_data", "message": "No snapshot available for SPY at 2025-01-01T10:01:00Z." } } ``` expirationNotFound: ```json { "error": { "code": "expiration_not_found", "message": "None of the requested expirations are available for SPY. Available: 2026-03-05, 2026-03-06, 2026-03-07." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. ### 503 Heatmap data is temporarily unavailable. --- Source: https://www.skylit.ai/docs/api-reference/heatmap/live-sse-stream-one-symbol-per-connection # Live SSE stream (one symbol per connection) `GET https://api.skylit.ai/v1/stream` API: Heatseeker. Credits: 1 to open + 1 per minute open. A **Server-Sent Events** (`text/event-stream`) feed of live per-strike heatmap updates for **one** symbol. Open one connection per symbol. **Events:** - `connected` — handshake, payload `{symbol, creditsRemaining}`. - `initial_data` — current heatmap snapshot on connect. - `snapshot_update` — full heatmap on each change. - `velocity_update` — per-strike % change. - `credits` — emitted every minute boundary, payload `{remaining}`. - `closed` — stream terminates with `{reason: "insufficient_credits" | "account_suspended" | "credit_check_failed"}`. - `reconnect` — server is recycling the connection (after ~1h), payload `{reason: "max_duration"}`. Reconnect to continue. - `: keepalive` comment every 30s for proxy keepalive. **Pricing.** 1 credit on connect (charged before the SSE upgrade — an under-funded client gets a clean `402` HTTP response, not a half-open stream), then 1 credit per minute open. The per-minute ticker emits `event: credits {remaining: N}` after each successful debit so clients can budget the next minute. **Concurrency.** Up to 5 concurrent streams per customer per pod. Exceeding the cap returns `429` `stream_limit_reached`. **Expirations.** Frames carry every expiration in the window (an `Expirations` array plus one matrix column per expiration), so select expirations client-side. The `expirations` parameter is snapshot-only — sending it here returns `400` `invalid_parameter` rather than quietly meaning something narrower than it does on `/v1/heatmap`. > OpenAPI is request/response-oriented and can't fully model an event > stream. The connection costs 1 credit to open plus 1 per minute > connected and closes after one hour; reconnect to continue. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbol` | query | string | yes | Single ticker to stream (e.g. `SPY`). One symbol per connection. | | `metric` | query | string | no | Which Greek exposure to return per strike. (one of `gamma`, `vanna`; default `gamma`) | | `maxStrikes` | query | integer | no | Maximum number of strikes around spot to return. (default `92`; min 1; max 400) | | `maxExpirations` | query | integer | no | How many of the nearest expirations to net into each strike's `value`. Ignored when `expirations` is set. (default `5`; min 1; max 60) | ## Example request ```bash curl -N "https://api.skylit.ai/v1/stream?symbol=SPY" \ -H "Authorization: Bearer $SKYLIT_API_KEY" \ -H "Accept: text/event-stream" ``` ## Responses ### 200 An SSE stream of heatmap events. `text/event-stream`: SSE frames, e.g. `event: snapshot_update` then `data: {SymbolHeatmap}`. The snapshot_update `data` payload matches #/components/schemas/SymbolHeatmap. ### 400 Request validation failed. ### 401 Missing or invalid API key. ### 403 The API key is invalid, revoked or expired, or the account is suspended. ### 404 Unknown symbol, no data available, or none of the requested `expirations` exist for the symbol (`code: expiration_not_found`). ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. --- Source: https://www.skylit.ai/docs/api-reference/heatmap/key-levels-classified-nodes-for-one-or-more-symbols # Key levels (classified nodes) for one or more symbols `GET https://api.skylit.ai/v1/gex/levels` API: Heatseeker. Credits: 1. The strikes Skylit classifies as nodes (king, gatekeeper, pika, barney, significant) for up to 10 symbols, strongest first, with each level's distance from spot. Same live source, filters and 5-second cache as `/v1/heatmap`; 1 credit per request. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbols` | query | string | yes | One ticker, or a comma-separated list for a single cross-asset call (e.g. `SPY` or `SPY,SPX,QQQ`). Each is returned as an element of `data.symbols`. | | `metric` | query | string | no | Which Greek exposure to return per strike. (one of `gamma`, `vanna`; default `gamma`) | | `maxStrikes` | query | integer | no | Maximum number of strikes around spot to return. (default `92`; min 1; max 400) | | `maxExpirations` | query | integer | no | How many of the nearest expirations to net into each strike's `value`. Ignored when `expirations` is set. (default `5`; min 1; max 60) | | `expirations` | query | string | no | Net each strike over exactly these expirations (`YYYY-MM-DD`, comma-separated) — one for a single-expiration heatmap (`2026-05-22`) or several for a custom set (`2026-05-22,2026-06-19`). Supersedes `maxExpirations`, and reaches any expiration the snapshot has, not just the nearest ones. Requested dates the symbol does not have are ignored; the `expirations` array in the response lists what was actually used. If none of them match, the response is `404` with `code: expiration_not_found` and the available dates in the message. On `/v1/heatmap`, expirations that have already expired are not available (they are trimmed from the live snapshot) — replay them with `/v1/historical` instead. | ## Example request ```bash curl "https://api.skylit.ai/v1/gex/levels?symbols=SPY,SPX,QQQ" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Levels per symbol. Shape (placeholder values): ```json { "data": { "symbols": [ { "symbol": "string", "asOf": "string", "spot": 0, "previousClose": 0, "kingNode": { "strike": 0, "value": 0, "nodeType": "king", "distancePct": 0 }, "levels": [ { "strike": 0, "value": 0, "nodeType": "king", "distancePct": 0 } ] } ] }, "meta": { "metric": "gamma", "resolution": "1m", "mode": "live", "cached": false } } ``` ### 400 Request validation failed. ### 401 Missing or invalid API key. ### 402 Out of credits (`insufficient_credits`). ### 404 Unknown symbol, no data available, or none of the requested `expirations` exist for the symbol (`code: expiration_not_found`). --- Source: https://www.skylit.ai/docs/api-reference/account/your-balance-and-limits # Your balance and limits `GET https://api.skylit.ai/v1/account` API: Heatseeker. The calling key's account: status, balance (credits and US dollars at $0.001 per credit), whether usage is unlimited, and the limits that apply. Free. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Example request ```bash curl "https://api.skylit.ai/v1/account" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Account. Shape (placeholder values): ```json { "data": { "customerId": "string", "status": "active", "apiEligible": false, "unlimited": false, "creditsBalance": 0, "balanceUsd": 0, "limits": { "requestsPerMinute": 0, "symbolsPerHeatmapCall": 0, "symbolsPerStream": 0, "historicalInFlight": 0, "activeKeys": 0, "streamMaxDurationMinutes": 0 } } } ``` ### 401 Missing or invalid API key. ### 404 Unknown symbol, no data available, or none of the requested `expirations` exist for the symbol (`code: expiration_not_found`). --- Source: https://www.skylit.ai/docs/api-reference/flow/raw-flow-feed-for-a-ticker-flow-score-flowbonus-per-trade # Raw flow feed for a ticker (Flow Score + FlowBonus per trade) `GET https://flow-api.skylit.ai/v1/flow/{ticker}` API: Flowseeker. Credits: 1. Returns the most recent options trades for `{ticker}` within the requested timeframe, each scored on Skylit's directional Flow Score (-100 → +100) and conviction-weighted FlowBonus. The response also includes timeframe-level VWF / SDF / FIR aggregates. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `timeframe` | query | string | no | Trailing window label for the request. Supported values: `5m`, `15m`, `1h`, `4h`, `1d`. (one of `5m`, `15m`, `1h`, `4h`, `1d`; default `1h`) | | `limit` | query | integer | no | Max trades returned. Server caps this at 500. (default `100`; min 1; max 500) | | `min_premium` | query | number (double) | no | Minimum total premium per trade (USD). | | `option_type` | query | string | no | Filter to calls or puts. `all` returns both. (one of `call`, `put`, `all`; default `all`) | | `trade_type` | query | string | no | Filter by trade type. Comma-separated for multiple. (one of `sweep`, `multi_leg`, `all`; default `all`) | | `moneyness` | query | string | no | Moneyness category filter. Comma-separated for multiple (e.g. `otm,deep_otm`). Unknown tokens are ignored. (one of `deep_itm`, `itm`, `atm`, `otm`, `deep_otm`, `all`; default `all`) | | `start_time` | query | string | no | Optional lower bound for the trade window. Accepts RFC 3339 (`2026-05-27T13:30:00Z`) or Unix seconds. Omit to use the timeframe. | | `end_time` | query | string | no | Optional upper bound (RFC 3339 or Unix seconds). | | `max_premium` | query | number (double) | no | Maximum total premium per trade (USD). | | `min_contracts` | query | integer | no | Minimum contract size per trade. (min 0) | | `max_contracts` | query | integer | no | Maximum contract size per trade. (min 0) | | `single_leg_only` | query | boolean | no | If `true`, exclude trades flagged as part of a multi-leg structure. (default `false`) | | `min_dte` | query | integer | no | Minimum days to expiration. | | `max_dte` | query | integer | no | Maximum days to expiration. | | `min_strike` | query | number (double) | no | Minimum strike price (inclusive). | | `max_strike` | query | number (double) | no | Maximum strike price (inclusive). | | `expiration` | query | string (date) | no | Filter to a single expiration date (YYYY-MM-DD). | | `conviction_weights` | query | string | no | Optional JSON object overriding the Flow Score conviction weights. Weights must be non-negative and sum to within 0.95–1.05, else 400. | | `min_flow_score` | query | integer | no | Filter to trades with `flowScore` ≥ this value (-100..100). (min -100; max 100) | | `min_flow_bonus` | query | integer | no | Filter to trades with `flowBonus` ≥ this value. (min 0) | | `min_rvol` | query | number (double) | no | Filter to trades with relative volume ≥ this multiple. (min 0) | | `include_clusters` | query | boolean | no | If `true`, attach `cluster*` fields when a trade is part of a multi-leg cluster (sweep, condor, etc.). (default `true`) | | `date` | query | string (date) | no | Trading date (YYYY-MM-DD). Defaults to current trading date. | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/flow/SPY" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Flow feed for `{ticker}`. Headers: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`, `X-Credits-Remaining`. Shape (placeholder values): ```json { "data": { "ticker": "string", "timeframe": "string", "trades": [ { "timestamp": "string", "tradeId": "flow_188afe42c3a77af2_0", "optionType": "CALL", "strike": 0, "expiration": "string", "dte": 0, "dteCategory": "zero_dte", "dteFactor": 0, "dteMultiplier": 0, "contracts": 0, "premium": 0, "price": 0, "bid": 0, "ask": 0, "mid": 0, "spreadWidth": 0, "spreadWidthPct": 0, "liquidityGrade": "A", "underlyingPrice": 0, "isSweep": false, "isMultiLeg": false, "exchangeCount": 0, "moneyness": "DEEP_ITM", "moneynessPct": 0, "moneynessWeight": 0, "combinedMoneynessDteWeight": 0, "delta": 0, "notionalDeltaExposure": 0, "openInterest": 0, "dailyVolume": 0, "volOiRatio": 0, "volOiScore": 0, "sizeOiRatio": 0, "sizeOiScore": 0, "oiIsZero": false, "rvol": 0, "rvolScore": 0, "rvolCategory": "string", "iv": 0, "ivChangePct": 0, "relativePremium": 0, "scores": { "flowScore": 0, "flowScoreInterpretation": "strong_bullish", "flowBonus": 0, "flowBonusInterpretation": "high_conviction", "baseDirection": 0, "convictionMultiplier": 0 }, "cluster": { "clusterId": "string", "clusterTradeCount": 0, "clusterTotalPremium": 0, "clusterTimeSpanSeconds": 0 } } ], "aggregate": { "vwf": 0, "sdf": 0, "fir": 0 }, "tradeCount": 0, "sweepCount": 0, "totalPremium": 0, "queryTimeMs": 0 }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/flow/aggregate-flow-over-an-arbitrary-start-end-window # Aggregate flow over an arbitrary [start, end] window `GET https://flow-api.skylit.ai/v1/flow/{ticker}/aggregate` API: Flowseeker. Credits: 3. Server-side aggregation across an arbitrary `[startTime, endTime]` window — no row cap. Returns trade/sweep counts, VWF/SDF/FIR, and a bullish/bearish/neutral premium split with a one-line interpretation. Useful for arbitrary slicing without paging the full trade list. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `start_time` | query | string | yes | Lower bound of the window. Accepts RFC 3339 (`2026-05-27T13:30:00Z`) or Unix seconds. | | `end_time` | query | string | yes | Upper bound of the window (RFC 3339 or Unix seconds). | | `option_type` | query | string | no | (one of `call`, `put`, `all`; default `all`) | | `min_premium` | query | number (double) | no | | | `exclude_multi_leg` | query | boolean | no | Exclude trades flagged as part of a multi-leg structure. (default `false`) | | `min_dte` | query | integer | no | (min 0) | | `max_dte` | query | integer | no | (min 0) | | `date` | query | string (date) | no | | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/flow/SPY/aggregate?start_time=2026-05-27T13:30:00Z&end_time=2026-05-27T20:00:00Z" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Window-aggregated flow scores. Shape (placeholder values): ```json { "data": { "ticker": "string", "startTime": "string", "endTime": "string", "tradeCount": 0, "sweepCount": 0, "totalPremium": 0, "aggregate": { "vwf": 0, "sdf": 0, "fir": 0, "composite": 0 }, "premiumSplit": { "bullishPremium": 0, "bearishPremium": 0, "neutralPremium": 0, "netPremium": 0, "bullishCount": 0, "bearishCount": 0, "neutralCount": 0, "sweepPremium": 0 }, "interpretation": { "bias": "bullish", "signalStrength": "strong" }, "queryTimeMs": 0 }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/flow/per-ticker-net-premium-time-series-flow-tide # Per-ticker net-premium time series ("flow tide") `GET https://flow-api.skylit.ai/v1/flow/{ticker}/tide` API: Flowseeker. Credits: 3. Bucketed bullish vs bearish premium time series for a single ticker, with cumulative net premium and per-bucket VWF/SDF/FIR. The ticker-level analogue of `/v1/market/tide`. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `start_time` | query | string | yes | Lower bound of the window. Accepts RFC 3339 (`2026-05-27T13:30:00Z`) or Unix seconds. | | `end_time` | query | string | yes | Upper bound of the window (RFC 3339 or Unix seconds). | | `bucket` | query | string | no | Bucket size for the time series. Coarser buckets (`1d`, `1w`) are rejected on intraday endpoints. (one of `1min`, `5min`, `15min`, `30min`, `1h`; default `5min`) | | `option_type` | query | string | no | (one of `call`, `put`, `all`; default `all`) | | `min_premium` | query | number (double) | no | | | `exclude_multi_leg` | query | boolean | no | (default `false`) | | `min_dte` | query | integer | no | (min 0) | | `max_dte` | query | integer | no | (min 0) | | `date` | query | string (date) | no | | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/flow/SPY/tide?start_time=2026-05-27T13:30:00Z&end_time=2026-05-27T20:00:00Z" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Per-bucket flow tide bars. Shape (placeholder values): ```json { "data": { "ticker": "string", "bucket": "string", "startTime": "string", "endTime": "string", "bars": [ { "timestamp": 0, "timestampEnd": 0, "bullishPremium": 0, "bearishPremium": 0, "neutralPremium": 0, "netPremium": 0, "bullishVolume": 0, "bearishVolume": 0, "vwf": 0, "sdf": 0, "fir": 0, "tradeCount": 0, "sweepCount": 0, "netPremiumCumulative": 0 } ], "queryTimeMs": 0 }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/flow/trailing-per-time-of-day-flow-baseline-avg-stddev # Trailing per-time-of-day flow baseline (avg + stddev) `GET https://flow-api.skylit.ai/v1/flow/{ticker}/baseline` API: Flowseeker. Credits: 3. Time-of-day baseline buckets for `{ticker}` — average and standard deviation of trade count, premium, and FIR per intraday bucket over a configurable lookback window. The reference distribution behind `/v1/flow/{ticker}/momentum` z-scores. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `bucket` | query | string | no | Bucket size for the time series. Coarser buckets (`1d`, `1w`) are rejected on intraday endpoints. (one of `1min`, `5min`, `15min`, `30min`, `1h`; default `5min`) | | `lookback_days` | query | integer | no | Trailing window size in trading days. (default `20`; min 1; max 30) | | `start_time_of_day` | query | string | no | Lower bound of intraday window (HH:MM ET). (default `09:30`) | | `end_time_of_day` | query | string | no | Upper bound of intraday window (HH:MM ET). (default `16:00`) | | `min_dte` | query | integer | no | (min 0) | | `max_dte` | query | integer | no | (min 0) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/flow/SPY/baseline" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Per-bucket baseline statistics. Shape (placeholder values): ```json { "data": { "ticker": "string", "bucket": "string", "lookbackDays": 0, "startTimeOfDay": "string", "endTimeOfDay": "string", "buckets": [ { "timeOfDay": "14:30", "daysCount": 0, "avgTradeCount": 0, "stddevTradeCount": 0, "avgPremium": 0, "stddevPremium": 0, "avgFir": 0, "stddevFir": 0 } ], "queryTimeMs": 0 }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/flow/live-momentum-signal-vs-baseline-5m-30m-1h-windows # Live momentum signal vs baseline (5m / 30m / 1h windows) `GET https://flow-api.skylit.ai/v1/flow/{ticker}/momentum` API: Flowseeker. Credits: 3. Compares the current 5-minute, 30-minute, and 1-hour flow against the trailing per-time-of-day baseline (`/v1/flow/{ticker}/baseline`). Returns z-scores for the 5-minute window and a one-token `trend` classification. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `as_of` | query | string | no | Replay anchor. Accepts RFC 3339 or Unix seconds. Defaults to "now". | | `lookback_days` | query | integer | no | Trailing window size in trading days. (default `20`; min 1; max 30) | | `min_dte` | query | integer | no | (min 0) | | `max_dte` | query | integer | no | (min 0) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/flow/SPY/momentum" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Live momentum metrics + signal. Shape (placeholder values): ```json { "data": { "ticker": "string", "asOf": "string", "current5m": { "tradeCount": 0, "premium": 0, "bullishPremium": 0, "bearishPremium": 0, "netPremium": 0, "fir": 0 }, "current30m": { "tradeCount": 0, "premium": 0, "bullishPremium": 0, "bearishPremium": 0, "netPremium": 0, "fir": 0 }, "current1h": { "tradeCount": 0, "premium": 0, "bullishPremium": 0, "bearishPremium": 0, "netPremium": 0, "fir": 0 }, "baseline": { "timeOfDay": "string", "lookbackDays": 0, "daysInBaseline": 0, "avg5mPremium": 0, "stddev5mPremium": 0, "avg5mFir": 0, "stddev5mFir": 0 }, "signals": { "firZscore5m": 0, "premiumZscore5m": 0, "trend": "accelerating", "interpretation": "string" }, "queryTimeMs": 0 }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/flow/strike-level-flow-concentration # Strike-level flow concentration `GET https://flow-api.skylit.ai/v1/flow/{ticker}/strikes` API: Flowseeker. Credits: 3. Where the directional money is going for `{ticker}`. Top-N strikes by selected ordering (premium, net premium, volume, etc.) with bullish/bearish premium split, ask/bid mix, and OI context. Includes a top-3 concentration summary. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `start_time` | query | string | yes | Lower bound of the window. Accepts RFC 3339 (`2026-05-27T13:30:00Z`) or Unix seconds. | | `end_time` | query | string | yes | Upper bound of the window (RFC 3339 or Unix seconds). | | `top_n` | query | integer | no | Number of strikes to return. (default `20`; min 1; max 100) | | `right` | query | string | no | Restrict to calls or puts only. (one of `call`, `put`) | | `min_premium` | query | number (double) | no | | | `order_by` | query | string | no | (one of `net_premium`, `total_premium`, `volume`; default `net_premium`) | | `min_dte` | query | integer | no | (min 0) | | `max_dte` | query | integer | no | (min 0) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/flow/SPY/strikes?start_time=2026-05-27T13:30:00Z&end_time=2026-05-27T20:00:00Z" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Top-N strike rollup. Shape (placeholder values): ```json { "data": { "ticker": "string", "startTime": "string", "endTime": "string", "byStrike": [ { "strike": 0, "right": "C", "dominantExpiration": "string", "tradeCount": 0, "volume": 0, "totalPremium": 0, "bullishPremium": 0, "bearishPremium": 0, "netPremium": 0, "askPct": 0, "bidPct": 0, "openInterest": 0, "volOiRatio": 0 } ], "concentration": { "top3StrikesShare": 0, "top3StrikesNetPremium": 0, "interpretation": "string" } }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/flow/today-s-flow-vs-trailing-average-with-similar-days-lookback # Today's flow vs trailing average (with similar-days lookback) `GET https://flow-api.skylit.ai/v1/flow/{ticker}/historical-compare` API: Flowseeker. Compares the current trading day's premium / volume / net premium / call-put ratio against the trailing 20-trading-day average for the same ticker. Returns absolute deltas, percentile rankings, and the five most-similar past trading days. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `date` | query | string (date) | no | Date to evaluate (YYYY-MM-DD). Defaults to today. | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/flow/SPY/historical-compare" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Today vs historical comparison. Shape (placeholder values): ```json { "data": { "ticker": "string", "date": "string", "current": { "totalPremium": 0, "totalVolume": 0, "callPremium": 0, "putPremium": 0, "netPremium": 0, "callPutRatio": 0, "callVolume": 0, "putVolume": 0 }, "historical": { "avgPremium": 0, "avgVolume": 0, "avgNetPremium": 0, "avgCallPutRatio": 0, "avgCallPremium": 0, "avgPutPremium": 0, "daysAnalyzed": 0 }, "vsAverage": { "premiumVsAvg": 0, "volumeVsAvg": 0, "netPremiumVsAvg": 0 }, "percentileRankings": { "premiumPercentile": 0, "volumePercentile": 0, "netPremiumPercentile": 0 }, "similarDays": [ { "date": "string", "netPremium": 0, "totalPremium": 0, "similarityScore": 0 } ] }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/sweeps/aggregated-multi-exchange-sweep-activity # Aggregated multi-exchange sweep activity `GET https://flow-api.skylit.ai/v1/sweeps/{ticker}` API: Flowseeker. Credits: 3. Returns "logical sweeps" — multi-exchange splits of one large order grouped by contract within a one-second execution window. Each row carries the venue list, total contracts/premium, spread position, moneyness bucket, and Skylit Flow Score / FlowBonus. The summary block adds population-level Sweep Dominance Factor (SDF) and bullish/bearish counts extrapolated from the full-day total. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `timeframe` | query | string | no | Trailing window. Currently only restricts the trading day; `5m`/`15m`/`1h`/`4h` reserved for future intraday filtering. (one of `5m`, `15m`, `1h`, `4h`, `1d`; default `1h`) | | `min_premium` | query | number (double) | no | | | `option_type` | query | string | no | (one of `call`, `put`, `all`; default `all`) | | `moneyness` | query | string | no | (one of `deep_itm`, `itm`, `atm`, `otm`, `deep_otm`, `all`; default `all`) | | `min_dte` | query | integer | no | (min 0) | | `max_dte` | query | integer | no | (min 0) | | `min_strike` | query | number (double) | no | | | `max_strike` | query | number (double) | no | | | `expiration` | query | string (date) | no | Restrict to a single expiration date (`YYYY-MM-DD`). | | `limit` | query | integer | no | Max sweep rows returned (server caps at 500). (default `100`; min 1; max 500) | | `date` | query | string (date) | no | | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/sweeps/SPY" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Sweep activity for `{ticker}`. Shape (placeholder values): ```json { "data": { "ticker": "string", "sweeps": [ { "timestamp": "string", "optionType": "CALL", "strike": 0, "expiration": "string", "dte": 0, "totalContracts": 0, "totalPremium": 0, "exchangeCount": 0, "exchanges": [ "string" ], "executionTimeMs": 0, "spreadPosition": "AT_ASK", "moneyness": "DEEP_ITM", "scores": { "flowScore": 0, "flowBonus": 0 } } ], "summary": { "totalSweeps": 0, "bullishSweeps": 0, "bearishSweeps": 0, "totalSweepPremium": 0, "sdf": 0, "returnedCount": 0 } }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/sector/sector-or-industry-level-flow-aggregation # Sector- or industry-level flow aggregation `GET https://flow-api.skylit.ai/v1/flow/sector/{sector}` API: Flowseeker. Credits: 3. Aggregates options flow across all tickers in a GICS sector. The `{sector}` path parameter accepts either a sector ETF symbol (`XLK`, `XLF`, `XLE`, …) or a sector name (`Technology`, `Financials`, …). Returns sector-level metrics, top-contributor tickers, and an industry-level breakdown. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `sector` | path | string | yes | Sector ETF symbol (`XLK`, `XLF`, `XLE`, `XLV`, `XLY`, `XLP`, `XLU`, `XLI`, `XLB`, `XLRE`, `XLC`) or full sector name (`Technology`, `Financials`, `Healthcare`, etc.). | | `date` | query | string (date) | no | | | `top_n` | query | integer | no | (default `10`; min 1; max 50) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/flow/sector/XLK" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Sector flow aggregation. Shape (placeholder values): ```json { "data": { "sector": "string", "etf": "string", "date": "string", "metrics": { "totalPremium": 0, "callPremium": 0, "putPremium": 0, "netPremium": 0, "totalVolume": 0, "callVolume": 0, "putVolume": 0, "netVolume": 0, "fir": 0, "putCallRatio": 0 }, "topContributors": [ { "ticker": "string", "netPremium": 0, "callPremium": 0, "putPremium": 0, "pctOfSector": 0 } ], "industryBreakdown": [ { "industry": "string", "netPremium": 0, "totalPremium": 0, "pctOfSector": 0, "tickerCount": 0 } ], "tickerCount": 0 }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/market/market-wide-breadth-advance-decline-and-sector-rotation # Market-wide breadth, advance/decline, and sector rotation `GET https://flow-api.skylit.ai/v1/flow/market-breadth` API: Flowseeker. Credits: 3. Combines SPY/QQQ/IWM aggregate sentiment with an advance/decline ratio (over directional FIR) and per-sector rotation signals. Ideal as a single "is the market risk-on or risk-off right now" probe. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `date` | query | string (date) | no | Trading date (YYYY-MM-DD). Defaults to today. | | `fir_threshold` | query | number (double) | no | Absolute FIR threshold (in %) used to classify a ticker as advancing or declining. Tickers with `\|fir\| < threshold` count as unchanged. (default `10`) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/flow/market-breadth" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Market breadth + advance/decline + sector rotation. Shape (placeholder values): ```json { "data": { "date": "string", "majorIndices": [ { "ticker": "string", "bullishPremium": 0, "bearishPremium": 0, "netPremium": 0, "fir": 0, "sentiment": "strong_bullish" } ], "aggregateSentiment": { "combinedBullish": 0, "combinedBearish": 0, "combinedNetPremium": 0, "combinedFir": 0, "sentiment": "strong_bullish" }, "advanceDecline": { "advancing": 0, "declining": 0, "unchanged": 0, "total": 0, "ratio": 0, "breadthPct": 0, "marketAvgFir": 0 }, "sectorRotation": [ { "sector": "string", "etf": "string", "fir": 0, "netPremium": 0, "signal": "strong_inflow" } ] }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/market/market-wide-flow-overview-for-the-current-trading-day # Market-wide flow overview for the current trading day `GET https://flow-api.skylit.ai/v1/market/overview` API: Flowseeker. Credits: 3. Returns market-wide call/put premium, total volume, directional bullish/bearish premium, FIR, premium relative volume vs the trailing 20-day baseline at the same time of day, and the top 10 tickers by total premium. Optionally narrowed to a comma-separated ticker filter. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `tickers` | query | string | no | Comma-separated list of tickers (e.g. `AAPL,NVDA,SPY`). When omitted, returns true market-wide stats over every ticker. | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/market/overview" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Market-wide overview snapshot. Shape (placeholder values): ```json { "data": { "date": "string", "totalPremium": 0, "totalVolume": 0, "callPremium": 0, "putPremium": 0, "netPremium": 0, "callVolume": 0, "putVolume": 0, "callPutRatio": 0, "activeTickers": 0, "bullishPremium": 0, "bearishPremium": 0, "directionalNet": 0, "fir": 0, "premiumRvol": 0, "topTickers": [ { "ticker": "string", "totalPremium": 0, "totalVolume": 0, "callPremium": 0, "putPremium": 0, "netPremium": 0 } ] }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/market/bucketed-market-wide-net-call-premium-net-put-premium-time-series # Bucketed market-wide net call premium / net put premium time series `GET https://flow-api.skylit.ai/v1/market/tide` API: Flowseeker. Credits: 3. Returns the market-wide intraday "tide" — bucketed Net Call Premium and Net Put Premium series with both per-bucket and cumulative values, plus an SPY price overlay for context. Two directional flavors are emitted per bar: the standard `ncp`/`npp` (call-buying minus call-selling, etc.) and a `manualNcp`/ `manualNpp` variant with fewer exclusions applied, for callers that need raw flow. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interval` | query | string | no | Trailing window length. Defaults to a single trading day (`1D`); multi-day intervals roll up history at the chosen bucket size. (one of `1D`, `2D`, `3D`, `5D`, `7D`, `14D`, `30D`, `45D`, `60D`, `90D`, `120D`, `180D`, `360D`; default `1D`) | | `bucket` | query | string | no | Bucket size for the time series. (one of `1min`, `5min`, `15min`, `30min`, `1d`, `1w`; default `5min`) | | `date` | query | string (date) | no | Trading date anchor (`YYYY-MM-DD`). Defaults to today. | | `exclude_multi_leg` | query | boolean | no | Exclude multi-leg / spread trades from the directional totals. (default `false`) | | `exclude_deep_itm` | query | boolean | no | Exclude deep in-the-money trades (`moneyness_percent < -20`) from the directional totals. (default `false`) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/market/tide" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Market tide bars. Shape (placeholder values): ```json { "data": { "interval": "string", "bucket": "string", "bars": [ { "timestamp": 0, "timestampEnd": 0, "ncp": 0, "npp": 0, "ncpCumulative": 0, "nppCumulative": 0, "manualNcp": 0, "manualNpp": 0, "manualNcpCumulative": 0, "manualNppCumulative": 0, "callVolume": 0, "putVolume": 0, "totalVolume": 0, "spyPrice": 0, "isGap": false } ] }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/analytics/aggregate-sentiment-scoring-across-timeframes-vwf-sdf-fir-composite # Aggregate sentiment scoring across timeframes (VWF / SDF / FIR / Composite) `GET https://flow-api.skylit.ai/v1/aggregate/{ticker}` API: Flowseeker. Credits: 3. Returns a Composite directional score plus its VWF / SDF / FIR components for one or more trailing timeframes (intraday or multi-day). Optional moneyness breakdown, optional time-decay weighting, and a comparative trend block contrasting short- vs long-horizon sentiment. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `timeframes` | query | string | no | Comma-separated timeframes, or `all`. Supported atoms: `1h, 4h, 1d, 7d, 30d, 90d`. `all` expands to all six. Unknown atoms are treated as a single trading day. (default `1d`) | | `include_breakdown` | query | boolean | no | Attach the per-timeframe VWF/SDF/FIR component split. (default `true`) | | `include_moneyness` | query | boolean | no | Attach a `byMoneyness` array (deep_itm → deep_otm). (default `false`) | | `moneyness_filter` | query | string | no | (one of `deep_itm`, `itm`, `atm`, `otm`, `deep_otm`, `all`; default `all`) | | `expiration_filter` | query | string | no | Restrict to one expiration bucket. (one of `0dte`, `weekly`, `monthly`, `leaps`, `all`; default `all`) | | `time_decay` | query | boolean | no | Apply exponential time decay to VWF / SDF / FIR components. (default `false`) | | `time_decay_half_life` | query | integer | no | Half-life in minutes for the decay (only applied when `timeDecay=true`). (default `30`; min 1) | | `date` | query | string (date) | no | | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/aggregate/SPY" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Aggregate sentiment by timeframe. Shape (placeholder values): ```json { "data": { "ticker": "string", "generatedAt": "string", "byTimeframe": {}, "trend": { "shortVsLong": "stable", "momentum": "stable", "description": "string" }, "byMoneyness": [ { "category": "DEEP_ITM", "composite": 0, "tradeCount": 0, "premium": 0, "pctOfTotal": 0 } ] }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/analytics/volume-vs-open-interest-accumulation-analysis # Volume-vs-Open-Interest accumulation analysis `GET https://flow-api.skylit.ai/v1/vol-oi/{ticker}` API: Flowseeker. Credits: 1. Distinguishes new position building (accumulation) from position closing (distribution) by bucketing Vol/OI ratios per option type and moneyness band. Returns an overall accumulation score (0–100), an estimate of the share of volume representing new positions, and a one-token signal (`strong_accumulation` → `low_activity`). ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `timeframe` | query | string | no | (one of `daily`, `weekly`; default `daily`) | | `option_type` | query | string | no | (one of `call`, `put`, `all`; default `all`) | | `moneyness` | query | string | no | (one of `otm_10plus`, `otm_5_10`, `otm_3_5`, `atm_itm`, `all`; default `all`) | | `min_oi` | query | integer | no | (min 0) | | `date` | query | string (date) | no | | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/vol-oi/SPY" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Vol/OI breakdown with accumulation score. Shape (placeholder values): ```json { "data": { "ticker": "string", "timestamp": "string", "timeframe": "daily", "volOiAnalysis": { "calls": { "totalVolume": 0, "totalOi": 0, "volOiRatio": 0, "signal": "strong_accumulation", "byMoneyness": { "otm10plus": { "volume": 0, "oi": 0, "ratio": 0 }, "otm510": { "volume": 0, "oi": 0, "ratio": 0 }, "otm35": { "volume": 0, "oi": 0, "ratio": 0 }, "atmItm": { "volume": 0, "oi": 0, "ratio": 0 } } }, "puts": { "totalVolume": 0, "totalOi": 0, "volOiRatio": 0, "signal": "strong_accumulation", "byMoneyness": { "otm10plus": { "volume": 0, "oi": 0, "ratio": 0 }, "otm510": { "volume": 0, "oi": 0, "ratio": 0 }, "otm35": { "volume": 0, "oi": 0, "ratio": 0 }, "atmItm": { "volume": 0, "oi": 0, "ratio": 0 } } } }, "accumulationScore": 0, "newPositionEstimatePct": 0, "signal": "strong_accumulation" }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/analytics/moneyness-breakdown-with-pattern-detection # Moneyness breakdown with pattern detection `GET https://flow-api.skylit.ai/v1/moneyness/{ticker}` API: Flowseeker. Credits: 1. Splits calls and puts across `deep_itm / itm / atm / otm / deep_otm` buckets with premium, sentiment, percentage of total, and trade count. Surfaces detected patterns (e.g. heavy OTM call accumulation, ATM concentration, deep-OTM lottery tickets) and a directional `signal`/`dominantStrategy` interpretation. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `timeframe` | query | string | no | (one of `intraday`, `daily`, `7d`, `30d`; default `daily`) | | `date` | query | string (date) | no | | | `min_premium` | query | number (double) | no | | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/moneyness/SPY" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Moneyness breakdown with patterns + interpretation. Shape (placeholder values): ```json { "data": { "ticker": "string", "timeframe": "string", "moneynessBreakdown": { "calls": { "deepItm": { "premium": 0, "sentiment": 0, "pctOfTotal": 0, "tradeCount": 0, "weightedPremium": 0 }, "itm": { "premium": 0, "sentiment": 0, "pctOfTotal": 0, "tradeCount": 0, "weightedPremium": 0 }, "atm": { "premium": 0, "sentiment": 0, "pctOfTotal": 0, "tradeCount": 0, "weightedPremium": 0 }, "otm": { "premium": 0, "sentiment": 0, "pctOfTotal": 0, "tradeCount": 0, "weightedPremium": 0 }, "deepOtm": { "premium": 0, "sentiment": 0, "pctOfTotal": 0, "tradeCount": 0, "weightedPremium": 0 }, "totalPremium": 0, "totalTrades": 0 }, "puts": { "deepItm": { "premium": 0, "sentiment": 0, "pctOfTotal": 0, "tradeCount": 0, "weightedPremium": 0 }, "itm": { "premium": 0, "sentiment": 0, "pctOfTotal": 0, "tradeCount": 0, "weightedPremium": 0 }, "atm": { "premium": 0, "sentiment": 0, "pctOfTotal": 0, "tradeCount": 0, "weightedPremium": 0 }, "otm": { "premium": 0, "sentiment": 0, "pctOfTotal": 0, "tradeCount": 0, "weightedPremium": 0 }, "deepOtm": { "premium": 0, "sentiment": 0, "pctOfTotal": 0, "tradeCount": 0, "weightedPremium": 0 }, "totalPremium": 0, "totalTrades": 0 } }, "notablePatterns": [ { "pattern": "otm_call_accumulation", "description": "string", "significance": "high", "metrics": { "premium": 0, "pctOfTotal": 0, "sentiment": 0 } } ], "interpretation": { "convictionFocus": "otm_calls", "dominantStrategy": "speculative_bullish", "signal": "bullish" } }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/ratios/chain-level-bid-ask-mid-distribution # Chain-level bid/ask/mid distribution `GET https://flow-api.skylit.ai/v1/chain-ratio/{ticker}` API: Flowseeker. Credits: 1. Aggregates a ticker's full option chain to surface buying vs selling pressure (`askRatio`, `bidRatio`, `midRatio`, `aggressionRatio`), call/put balance, and ATM/OTM concentration. Returns a `bias`, `aggression`, and `confidence` interpretation. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `date` | query | string (date) | no | | | `timeframe` | query | string | no | (one of `5m`, `15m`, `1h`, `4h`, `1d`; default `1d`) | | `option_type` | query | string | no | (one of `call`, `put`, `all`; default `all`) | | `min_premium` | query | integer | no | (min 0) | | `min_dte` | query | integer | no | (min 0) | | `max_dte` | query | integer | no | (min 0) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/chain-ratio/SPY" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Chain ratio analysis with interpretation. Shape (placeholder values): ```json { "data": { "ticker": "string", "date": "string", "timeframe": "string", "tradeCount": 0, "totalPremium": 0, "chainRatios": { "callPutRatio": 0, "askRatio": 0, "bidRatio": 0, "midRatio": 0, "aggressionRatio": 0, "atmConcentration": 0, "otmCallConcentration": 0, "otmPutConcentration": 0 }, "interpretation": { "bias": "BULLISH", "aggression": "HIGH", "confidence": "HIGH", "description": "string" } }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/ratios/per-contract-bid-ask-mid-distribution # Per-contract bid/ask/mid distribution `GET https://flow-api.skylit.ai/v1/contract-ratio/{symbol}` API: Flowseeker. Credits: 1. Single-contract counterpart to `/v1/chain-ratio/{ticker}`. Returns `askRatio`, `bidRatio`, `midRatio`, `aggressionRatio`, and a `bias`/`aggression`/`confidence` interpretation for one specific OPRA option symbol. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbol` | path | string | yes | OPRA option symbol in URL-safe form: `{ticker}__{YYMMDD}{C\|P}{strike×1000, 8 digits}` — the ticker and the 15-character contract block are joined by a **double underscore** (`__`). For example, an AAPL $250 call expiring 2026-01-17 is `AAPL__260117C00250000`. (A space-padded 21-char OCC form such as `AAPL 260117C00250000` is also accepted on some endpoints, but the `__` form is canonical and works across all contract routes.) | | `date` | query | string (date) | no | | | `timeframe` | query | string | no | (one of `5m`, `15m`, `1h`, `4h`, `1d`; default `1d`) | | `min_premium` | query | integer | no | (min 0) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/contract-ratio/SPY__250516C00580000" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Contract ratio analysis with interpretation. Shape (placeholder values): ```json { "data": { "symbol": "SPY 250516C00580000", "ticker": "string", "optionType": "CALL", "date": "string", "timeframe": "string", "tradeCount": 0, "totalVolume": 0, "totalPremium": 0, "contractRatios": { "askRatio": 0, "bidRatio": 0, "midRatio": 0, "aggressionRatio": 0 }, "interpretation": { "bias": "BULLISH", "aggression": "HIGH", "confidence": "HIGH", "description": "string" } }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/ratios/chain-level-call-put-aware-bull-bear-pressure # Chain-level call/put-aware bull/bear pressure `GET https://flow-api.skylit.ai/v1/chain-bull-bear/{ticker}` API: Flowseeker. Credits: 3. Folds option type into the bid/ask/mid signal: a call lifted at the ask is bullish, a put hit at the bid is also bullish (put selling), etc. Returns overall bull/bear/neutral percentages plus call-only and put-only bull breakdowns so callers can tell whether the directional pressure originates from call buying, put selling, or both. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `date` | query | string (date) | no | | | `timeframe` | query | string | no | (one of `5m`, `15m`, `1h`, `4h`, `1d`; default `1d`) | | `option_type` | query | string | no | (one of `call`, `put`, `all`; default `all`) | | `min_premium` | query | integer | no | (min 0) | | `min_dte` | query | integer | no | (min 0) | | `max_dte` | query | integer | no | (min 0) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/chain-bull-bear/SPY" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Chain-level bull/bear analysis. Shape (placeholder values): ```json { "data": { "ticker": "string", "date": "string", "timeframe": "string", "tradeCount": 0, "totalVolume": 0, "totalPremium": 0, "metrics": { "bullPct": 0, "bearPct": 0, "neutralPct": 0, "bullBearRatio": 0, "callBullPct": 0, "putBullPct": 0 }, "interpretation": { "bias": "BULLISH", "strength": "strong", "confidence": "HIGH", "description": "string" } }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/ratios/per-contract-call-put-aware-bull-bear-pressure # Per-contract call/put-aware bull/bear pressure `GET https://flow-api.skylit.ai/v1/contract-bull-bear/{symbol}` API: Flowseeker. Credits: 1. Single-contract counterpart to `/v1/chain-bull-bear/{ticker}`. Maps a contract's trades to bull/bear/neutral buckets using both side (bid/ask/mid) and option type, so a bullish put-seller and a bullish call-buyer both register as bullish pressure. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbol` | path | string | yes | OPRA option symbol in URL-safe form: `{ticker}__{YYMMDD}{C\|P}{strike×1000, 8 digits}` — the ticker and the 15-character contract block are joined by a **double underscore** (`__`). For example, an AAPL $250 call expiring 2026-01-17 is `AAPL__260117C00250000`. (A space-padded 21-char OCC form such as `AAPL 260117C00250000` is also accepted on some endpoints, but the `__` form is canonical and works across all contract routes.) | | `date` | query | string (date) | no | | | `timeframe` | query | string | no | (one of `5m`, `15m`, `1h`, `4h`, `1d`; default `1d`) | | `min_premium` | query | integer | no | (min 0) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/contract-bull-bear/SPY__250516C00580000" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Per-contract bull/bear analysis. Shape (placeholder values): ```json { "data": { "symbol": "string", "ticker": "string", "optionType": "CALL", "date": "string", "timeframe": "string", "tradeCount": 0, "totalVolume": 0, "totalPremium": 0, "metrics": { "bullPct": 0, "bearPct": 0, "neutralPct": 0, "bullBearRatio": 0 }, "interpretation": { "bias": "BULLISH", "strength": "strong", "confidence": "HIGH", "description": "string" } }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/scoring/detailed-scoring-for-a-single-trade # Detailed scoring for a single trade `GET https://flow-api.skylit.ai/v1/score/{trade_id}` API: Flowseeker. Credits: 1. Returns sentiment, urgency, and confidence scores for an individual trade plus a spread-level breakdown and full trade context (ticker, strike, expiration, sweep/block flags, moneyness). Used to drill into a single row from `/v1/flow/{ticker}`. The `trade_id` path parameter accepts three formats: the canonical `flow_{hex}_{idx}` id returned by the flow feed, a bare hex timestamp (`188afe42c3a77af2`), or a raw nanosecond integer. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `trade_id` | path | string | yes | Trade id (`flow_{hex}_{idx}`, bare hex timestamp, or raw nanos). | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/score/flow_188afe42c3a77af2_0" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Trade scoring breakdown. Shape (placeholder values): ```json { "data": { "tradeId": "flow_188afe42c3a77af2_0", "scores": { "sentiment": 0, "urgency": 0, "confidence": 0 }, "interpretation": { "direction": "bullish", "intent": "string", "description": "string" }, "spreadAnalysis": { "bid": 0, "ask": 0, "mid": 0, "tradePrice": 0, "positionInSpread": "above_ask", "spreadWidth": 0, "spreadPct": 0 }, "tradeContext": { "ticker": "string", "timestamp": "string", "optionType": "call", "strike": 0, "expiration": "string", "premium": 0, "size": 0, "underlyingPrice": 0, "tradeType": "sweep", "dte": 0, "moneyness": "deep_itm", "moneynessPct": 0 } }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/list-underlyings-active-on-a-date # List underlyings active on a date `GET https://flow-api.skylit.ai/v1/underlying` API: Flowseeker. Credits: 1. Lists every ticker that traded options on the requested date, ordered by total premium (descending). Useful as a starting point for discovery or for repopulating the universe of tradable tickers. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `limit` | query | integer | no | Maximum rows to return. Server caps at 500. (default `100`; min 1; max 500) | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | | `min_premium` | query | number (double) | no | Minimum total premium (USD) for the day. (min 0) | | `min_volume` | query | integer | no | Minimum total option volume for the day. (min 0) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Tickers ranked by total premium. Shape (placeholder values): ```json { "data": [ { "ticker": "SPY", "totalPremium": 0, "totalVolume": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/prefix-search-active-tickers # Prefix-search active tickers `GET https://flow-api.skylit.ai/v1/underlying/search` API: Flowseeker. Credits: 1. Case-insensitive prefix search over the active-tickers universe for the requested date. Use to power autocomplete UIs. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `q` | query | string | yes | Search prefix (1–10 characters, uppercased server-side). | | `limit` | query | integer | no | (default `20`; min 1; max 50) | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying/search?q=AAP" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Matching tickers (capped at 50). Shape (placeholder values): ```json { "data": [ { "ticker": "SPY", "totalPremium": 0, "totalVolume": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/top-underlyings-by-daily-flow # Top underlyings by daily flow `GET https://flow-api.skylit.ai/v1/underlying/top/daily` API: Flowseeker. Credits: 1. Top tickers for a single trading day, with call/put premium and volume splits, net premium, and call/put ratio. Sortable by `premium`, `volume`, `net_premium`, or `call_put_ratio`. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `limit` | query | integer | no | Maximum rows to return. Server caps at 500. (default `100`; min 1; max 500) | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | | `min_premium` | query | number (double) | no | (min 0) | | `min_volume` | query | integer | no | (min 0) | | `order_by` | query | string | no | (one of `premium`, `volume`, `net_premium`, `call_put_ratio`; default `premium`) | | `order` | query | string | no | (one of `asc`, `desc`; default `desc`) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying/top/daily" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Top underlyings for the day. Shape (placeholder values): ```json { "data": [ { "ticker": "string", "totalPremium": 0, "totalVolume": 0, "callPremium": 0, "putPremium": 0, "callVolume": 0, "putVolume": 0, "netPremium": 0, "callPutRatio": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/top-underlyings-by-trailing-5-day-flow # Top underlyings by trailing-5-day flow `GET https://flow-api.skylit.ai/v1/underlying/top/weekly` API: Flowseeker. Credits: 1. Same shape as `/v1/underlying/top/daily` but rolled up across the trailing 5 trading days ending on `date`. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `limit` | query | integer | no | Maximum rows to return. Server caps at 500. (default `100`; min 1; max 500) | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | | `min_premium` | query | number (double) | no | (min 0) | | `min_volume` | query | integer | no | (min 0) | | `order_by` | query | string | no | (one of `premium`, `volume`, `net_premium`, `call_put_ratio`; default `premium`) | | `order` | query | string | no | (one of `asc`, `desc`; default `desc`) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying/top/weekly" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Top underlyings for the trailing week. Shape (placeholder values): ```json { "data": [ { "ticker": "string", "totalPremium": 0, "totalVolume": 0, "callPremium": 0, "putPremium": 0, "callVolume": 0, "putVolume": 0, "netPremium": 0, "callPutRatio": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/bulk-underlying-stats-for-a-list-of-tickers # Bulk underlying stats for a list of tickers `GET https://flow-api.skylit.ai/v1/underlying/bulk/stats` API: Flowseeker. Returns a single-day `UnderlyingStats` record per requested ticker. Tickers absent from the response had no options activity that day. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `tickers` | query | string | yes | Comma-separated list of tickers (max 50). | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying/bulk/stats?tickers=SPY,AAPL,NVDA" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Per-ticker stats. Shape (placeholder values): ```json { "data": [ { "ticker": "string", "date": "string", "lastPrice": 0, "totalPremium": 0, "totalVolume": 0, "callPremium": 0, "putPremium": 0, "callVolume": 0, "putVolume": 0, "netPremium": 0, "callPutRatio": 0, "tradeCount": 0, "uniqueStrikes": 0, "uniqueExpirations": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/daily-stats-for-a-single-underlying # Daily stats for a single underlying `GET https://flow-api.skylit.ai/v1/underlying/{ticker}/stats` API: Flowseeker. Credits: 1. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying/SPY/stats" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Stats for the ticker on the requested date. Shape (placeholder values): ```json { "data": { "ticker": "string", "date": "string", "lastPrice": 0, "totalPremium": 0, "totalVolume": 0, "callPremium": 0, "putPremium": 0, "callVolume": 0, "putVolume": 0, "netPremium": 0, "callPutRatio": 0, "tradeCount": 0, "uniqueStrikes": 0, "uniqueExpirations": 0 }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/intraday-chart-bars-for-a-ticker # Intraday chart bars for a ticker `GET https://flow-api.skylit.ai/v1/underlying/{ticker}/chart` API: Flowseeker. Credits: 3. Returns time-bucketed bars aggregating options activity for the underlying (call/put volume + premium, P/C ratio, bid/ask execution split) plus the underlying stock price at each boundary. The same data that powers the chart modal in the Skylit UI. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `interval` | query | string | yes | Trailing window covered by the bars (e.g. `1D`, `7D`, `30D`). | | `bucket` | query | string | yes | Bucket size. (one of `1min`, `5min`, `10min`, `15min`, `30min`, `1d`, `1w`) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying/SPY/chart?interval=1D&bucket=" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Intraday chart bars. Shape (placeholder values): ```json { "data": [ { "timestamp": "1745418600", "timestampEnd": "1745418900", "callVolume": 0, "putVolume": 0, "candleVolume": 0, "callPremium": 0, "putPremium": 0, "candlePremium": 0, "stockPrice": 0, "pcRatio": 0, "avgVolume": 0, "avgPremium": 0, "chainBidPct": 0, "chainAskPct": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/raw-enriched-trades-for-a-ticker # Raw enriched trades for a ticker `GET https://flow-api.skylit.ai/v1/underlying/{ticker}/trades` API: Flowseeker. Returns the raw enriched trade rows that feed the chart bars and the live feed. Supports rich filtering — sweep-only / multi-leg, moneyness, premium floor, DTE / strike / expiration windows. See `OptionTradeRow` below. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `start` | query | string | no | Lower time bound — ISO 8601 (e.g. `2026-01-12T09:30:00Z`) or Unix seconds. Defaults to start-of-trading-day. | | `end` | query | string | no | Upper time bound — ISO 8601 or Unix seconds. Defaults to now. | | `limit` | query | integer | no | (default `50`; min 1; max 500) | | `only_sweeps` | query | boolean | no | (default `false`) | | `only_multi_leg` | query | boolean | no | (default `false`) | | `exclude_multi_leg` | query | boolean | no | (default `false`) | | `moneyness` | query | string | no | (one of `ITM`, `ATM`, `OTM`) | | `min_moneyness_pct` | query | number (double) | no | | | `max_moneyness_pct` | query | number (double) | no | | | `min_premium` | query | number (double) | no | (min 0) | | `min_dte` | query | integer | no | | | `max_dte` | query | integer | no | | | `min_strike` | query | number (double) | no | | | `max_strike` | query | number (double) | no | | | `expiration` | query | string (date) | no | | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying/SPY/trades" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Filtered enriched trades. Shape (placeholder values): ```json { "data": [ { "date": 0, "tsEvent": 0, "tsEventUs": 0, "instrumentId": 0, "rawSymbol": "SPY 250516C00580000", "ticker": "SPY", "expiration": 0, "strike": 0, "right": "C", "dte": 0, "price": 0, "size": 0, "side": "BB", "publisherId": 0, "bidPx": 0, "askPx": 0, "bidSz": 0, "askSz": 0, "neutralSz": 0, "totalPremium": 0, "spread": 0, "underlyingPrice": 0, "iv": 0, "moneyness": "ITM", "moneynessPercent": 0, "openInterest": 0, "prevOi": 0, "prevClose": 0, "prevCloseAge": 0, "priceChange": 0, "dailyVolume": 0, "sweepTrade": false, "blockTrade": false, "multiLeg": false, "ivDirection": -1, "ingestionTimestamp": 0, "prevIv": 0, "nextIv": 0, "premiumPercentile": 0, "flowScore": 0, "chainBidPct": 0, "chainAskPct": 0, "contractBidPct": 0, "contractAskPct": 0, "aggCount": 0, "aggTotalPremium": 0, "aggTotalSize": 0, "mlSibling": false, "strategyGroupId": "string", "strategyType": "string", "strategyLegCount": 0, "earningsDte": 0, "nextEarningsDate": 0, "cacheMiss": false, "sector": "string", "industry": "string" } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/premium-volume-by-strike # Premium / volume by strike `GET https://flow-api.skylit.ai/v1/underlying/{ticker}/by-strike` API: Flowseeker. Credits: 3. Strike-level distribution of call/put premium, volume, and OI for the requested window, plus chain-wide aggregates and a max-pain estimate. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `interval` | query | string | no | (one of `1D`, `1W`, `7D`; default `1D`) | | `dte_filter` | query | string | no | DTE bucket — `all`, `0-7`, `8-30`, `31-90`, or `90+`. (one of `all`, `0-7`, `8-30`, `31-90`, `90+`; default `all`) | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying/SPY/by-strike" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Strike distribution. Shape (placeholder values): ```json { "data": { "ticker": "string", "interval": "1D", "dteFilter": "all", "underlyingPrice": 0, "totalCallPremium": 0, "totalPutPremium": 0, "totalCallVolume": 0, "totalPutVolume": 0, "pcRatio": 0, "topStrike": 0, "strikeCount": 0, "maxPain": 0, "bars": [ { "strike": 0, "callVolume": 0, "putVolume": 0, "callPremium": 0, "putPremium": 0, "callOi": 0, "putOi": 0 } ] }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/premium-volume-by-expiration-for-a-strike # Premium / volume by expiration for a strike `GET https://flow-api.skylit.ai/v1/underlying/{ticker}/by-strike/{strike}/expirations` API: Flowseeker. For a single strike on the underlying, breaks the requested window's premium and volume out by expiration date. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `strike` | path | string | yes | Strike price (decimal allowed; e.g. `580` or `580.5`). | | `interval` | query | string | no | (one of `1D`, `1W`, `7D`; default `1D`) | | `dte_filter` | query | string | no | (one of `all`, `0-7`, `8-30`, `31-90`, `90+`; default `all`) | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying/SPY/by-strike/580/expirations" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Expiration breakdown for the strike. Shape (placeholder values): ```json { "data": { "ticker": "string", "strike": 0, "interval": "1D", "totalCallPremium": 0, "totalPutPremium": 0, "topExpiration": "string", "expirationCount": 0, "bars": [ { "expiration": "string", "dte": 0, "callVolume": 0, "putVolume": 0, "callPremium": 0, "putPremium": 0 } ] }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/list-traded-expirations-for-a-ticker # List traded expirations for a ticker `GET https://flow-api.skylit.ai/v1/underlying/{ticker}/expirations` API: Flowseeker. Credits: 1. Returns each expiration that traded on `date`, with per-expiration call/put volume + premium and the unique-contract count. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying/SPY/expirations" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Expirations with per-expiry totals. Shape (placeholder values): ```json { "data": [ { "expiration": "string", "dte": 0, "callVolume": 0, "putVolume": 0, "callPremium": 0, "putPremium": 0, "contractCount": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/option-chain-snapshot # Option chain snapshot `GET https://flow-api.skylit.ai/v1/underlying/{ticker}/chain` API: Flowseeker. Credits: 3. Snapshot of the option chain for a single expiration on the requested date — call & put volume, premium, OI, last IV, and last trade price per strike, plus the underlying price. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `expiration` | query | string (date) | yes | Expiration date (`YYYY-MM-DD`). | | `min_volume` | query | integer | no | Suppress strikes whose total (call+put) volume is below this floor. (min 0) | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying/SPY/chain?expiration=2026-08-21" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Chain snapshot. Shape (placeholder values): ```json { "data": { "ticker": "string", "expiration": "string", "underlyingPrice": 0, "strikes": [ { "strike": 0, "callVolume": 0, "callPremium": 0, "callOi": 0, "callIv": 0, "callLastPrice": 0, "putVolume": 0, "putPremium": 0, "putOi": 0, "putIv": 0, "putLastPrice": 0 } ] }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/daily-history-for-a-ticker # Daily history for a ticker `GET https://flow-api.skylit.ai/v1/underlying/{ticker}/history` API: Flowseeker. Daily aggregates (premium, volume, call/put split, net premium) between `startDate` and `endDate` (inclusive), one row per trading day with activity. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `start_date` | query | string (date) | yes | | | `end_date` | query | string (date) | yes | | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying/SPY/history?start_date=2026-01-02&end_date=2026-01-31" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 One row per trading day. Shape (placeholder values): ```json { "data": [ { "date": "string", "totalPremium": 0, "totalVolume": 0, "callPremium": 0, "putPremium": 0, "callVolume": 0, "putVolume": 0, "netPremium": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/underlying/relative-volume-bars-for-a-ticker # Relative-volume bars for a ticker `GET https://flow-api.skylit.ai/v1/underlying/{ticker}/rvol` API: Flowseeker. Credits: 1. Time-bucketed bars with call/put volume + premium and an average-volume baseline computed from `avgPeriod` recent days, plus aggregate RVOL stats. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `interval` | query | string | no | Trailing window — `{N}D` where N is 1–365 (e.g. `1D`, `7D`, `30D`). (default `1D`) | | `bucket` | query | string | no | (one of `1min`, `5min`, `10min`, `15min`, `30min`, `1d`, `1w`; default `5min`) | | `avg_period` | query | string | no | Baseline lookback as `{N}d` (e.g. `14d`, `30d`). Max 365 days. (default `14d`) | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | | `order_by` | query | string | no | (one of `rvol`, `volume`, `premium`, `time`; default `time`) | | `order` | query | string | no | Sort direction. Defaults to `asc` when `order_by=time`, otherwise `desc`. (one of `asc`, `desc`) | | `limit` | query | integer | no | (min 1) | | `format` | query | string | no | (one of `full`, `summary`; default `full`) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/underlying/SPY/rvol" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 RVOL bars + aggregate stats. Shape (placeholder values): ```json { "data": { "bars": [ { "timestamp": "string", "timestampEnd": "string", "callVolume": 0, "putVolume": 0, "volume": 0, "premium": 0, "stockPrice": 0, "avgCallVolume": 0, "avgPutVolume": 0, "avgVolume": 0, "avgPremium": 0, "avgDaysCount": 0 } ], "stats": { "todayVolume": 0, "todayPremium": 0, "avgVolume": 0, "avgPremium": 0, "rvolVolume": 0, "rvolPremium": 0, "avgDaysCount": 0 }, "callRvol": 0, "putRvol": 0 }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/contract/top-contracts-by-daily-flow # Top contracts by daily flow `GET https://flow-api.skylit.ai/v1/contract/top/daily` API: Flowseeker. Credits: 1. Single-day top-contract screener with full-spectrum filters (premium / volume / OI / IV / DTE / strike windows, call vs put, sweep vs multi-leg). Sortable by `premium`, `volume`, `oi`, or `iv`. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `limit` | query | integer | no | Maximum rows to return. Server caps at 500. (default `100`; min 1; max 500) | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | | `ticker` | query | string | no | | | `min_premium` | query | number (double) | no | | | `max_premium` | query | number (double) | no | | | `min_volume` | query | integer | no | (min 0) | | `max_volume` | query | integer | no | (min 0) | | `min_oi` | query | integer | no | (min 0) | | `max_oi` | query | integer | no | (min 0) | | `right` | query | string | no | (one of `C`, `P`) | | `min_dte` | query | integer | no | | | `max_dte` | query | integer | no | | | `min_strike` | query | number (double) | no | | | `max_strike` | query | number (double) | no | | | `expiration` | query | string (date) | no | | | `min_iv` | query | number (double) | no | | | `max_iv` | query | number (double) | no | | | `order_by` | query | string | no | (one of `premium`, `volume`, `oi`, `iv`; default `premium`) | | `order` | query | string | no | (one of `asc`, `desc`; default `desc`) | | `only_sweeps` | query | boolean | no | (default `false`) | | `only_multi_leg` | query | boolean | no | (default `false`) | | `exclude_multi_leg` | query | boolean | no | (default `false`) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/contract/top/daily" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Top contracts for the day. Shape (placeholder values): ```json { "data": [ { "symbol": "SPY 250516C00580000", "ticker": "string", "expiration": "string", "strike": 0, "right": "C", "dte": 0, "totalPremium": 0, "totalVolume": 0, "openInterest": 0, "oiChange": 0, "volumeOiRatio": 0, "bidVolume": 0, "askVolume": 0, "midVolume": 0, "vwap": 0, "lastPrice": 0, "underlyingPrice": 0, "iv": 0, "tradeCount": 0, "sweepVolume": 0, "sweepPremium": 0, "multiLegVolume": 0, "multiLegPremium": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/contract/top-contracts-by-trailing-5-day-flow # Top contracts by trailing-5-day flow `GET https://flow-api.skylit.ai/v1/contract/top/weekly` API: Flowseeker. Credits: 1. Same shape as `/v1/contract/top/daily`, rolled up over the trailing 5 trading days ending on `date`. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `limit` | query | integer | no | Maximum rows to return. Server caps at 500. (default `100`; min 1; max 500) | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | | `ticker` | query | string | no | | | `min_premium` | query | number (double) | no | | | `max_premium` | query | number (double) | no | | | `min_volume` | query | integer | no | (min 0) | | `max_volume` | query | integer | no | (min 0) | | `min_oi` | query | integer | no | (min 0) | | `max_oi` | query | integer | no | (min 0) | | `right` | query | string | no | (one of `C`, `P`) | | `min_dte` | query | integer | no | | | `max_dte` | query | integer | no | | | `min_strike` | query | number (double) | no | | | `max_strike` | query | number (double) | no | | | `expiration` | query | string (date) | no | | | `min_iv` | query | number (double) | no | | | `max_iv` | query | number (double) | no | | | `order_by` | query | string | no | (one of `premium`, `volume`, `oi`, `iv`; default `premium`) | | `order` | query | string | no | (one of `asc`, `desc`; default `desc`) | | `only_sweeps` | query | boolean | no | (default `false`) | | `only_multi_leg` | query | boolean | no | (default `false`) | | `exclude_multi_leg` | query | boolean | no | (default `false`) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/contract/top/weekly" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Top contracts for the trailing week. Shape (placeholder values): ```json { "data": [ { "symbol": "SPY 250516C00580000", "ticker": "string", "expiration": "string", "strike": 0, "right": "C", "dte": 0, "totalPremium": 0, "totalVolume": 0, "openInterest": 0, "oiChange": 0, "volumeOiRatio": 0, "bidVolume": 0, "askVolume": 0, "midVolume": 0, "vwap": 0, "lastPrice": 0, "underlyingPrice": 0, "iv": 0, "tradeCount": 0, "sweepVolume": 0, "sweepPremium": 0, "multiLegVolume": 0, "multiLegPremium": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/contract/contracts-with-unusual-relative-volume # Contracts with unusual relative volume `GET https://flow-api.skylit.ai/v1/contract/unusual-volume` API: Flowseeker. Credits: 3. Contracts whose volume on the target date is anomalously high relative to a `avgPeriod`-day baseline. Filters cover RVOL, raw volume, OI dynamics, premium, IV, moneyness, sweep / multi-leg, and ticker include / exclude lists. Sortable by `rvol`, `volume`, `premium`, `vol_oi`, or `oi_change`. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `limit` | query | integer | no | Maximum rows to return. (default `50`; min 1; max 200) | | `min_rvol` | query | number (double) | no | (default `2`) | | `avg_period` | query | string | no | Baseline window as `{N}d`. Must be 2–365 days. (default `10d`) | | `min_avg_volume` | query | integer | no | (default `100`; min 0) | | `min_premium` | query | number (double) | no | | | `ticker` | query | string | no | | | `right` | query | string | no | (one of `C`, `P`) | | `min_dte` | query | integer | no | | | `max_dte` | query | integer | no | | | `min_strike` | query | number (double) | no | | | `max_strike` | query | number (double) | no | | | `expiration` | query | string (date) | no | | | `date` | query | string (date) | no | Target trading date (`YYYY-MM-DD`). Defaults to the **previous calendar day** (not the current trading date) since baselines need a settled session. | | `order_by` | query | string | no | (one of `rvol`, `volume`, `premium`, `vol_oi`, `oi_change`; default `rvol`) | | `min_vol_oi_ratio` | query | number (double) | no | | | `min_oi_change` | query | integer | no | | | `max_oi_change` | query | integer | no | | | `only_sweeps` | query | boolean | no | | | `only_multi_leg` | query | boolean | no | | | `exclude_multi_leg` | query | boolean | no | | | `min_oi_change_pct` | query | number (double) | no | | | `min_bid_imbalance` | query | number (double) | no | (min 0; max 1) | | `min_ask_imbalance` | query | number (double) | no | (min 0; max 1) | | `moneyness` | query | string | no | (one of `ITM`, `ATM`, `OTM`) | | `min_moneyness_pct` | query | number (double) | no | | | `max_moneyness_pct` | query | number (double) | no | | | `min_iv` | query | number (double) | no | | | `max_iv` | query | number (double) | no | | | `exclude_tickers` | query | string | no | Comma-separated tickers to exclude (e.g. `SPY,QQQ,IWM`). | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/contract/unusual-volume" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Contracts ranked by the requested metric. Shape (placeholder values): ```json { "data": [ { "symbol": "string", "ticker": "string", "expiration": "string", "strike": 0, "right": "C", "dte": 0, "date": "string", "volume": 0, "avgVolume": 0, "rvol": 0, "premium": 0, "openInterest": 0, "prevOi": 0, "oiChange": 0, "oiChangePct": 0, "volumeOiRatio": 0, "bidVolume": 0, "askVolume": 0, "bidPct": 0, "askPct": 0, "lastPrice": 0, "underlyingPrice": 0, "iv": 0, "moneynessPct": 0, "sweepVolume": 0, "sweepPremium": 0, "multiLegVolume": 0, "multiLegPremium": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/contract/contracts-with-significant-oi-changes # Contracts with significant OI changes `GET https://flow-api.skylit.ai/v1/contract/unusual-oi` API: Flowseeker. Credits: 3. Contracts whose open interest changed by at least `min_oi_change` (or `min_oi_change_pct`) on the target date. `direction` narrows the result to opening (OI ↑) or closing (OI ↓) flow. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `limit` | query | integer | no | Maximum rows to return. (default `50`; min 1; max 200) | | `min_oi_change` | query | integer | no | (default `500`) | | `min_oi_change_pct` | query | number (double) | no | (default `25`) | | `ticker` | query | string | no | | | `right` | query | string | no | (one of `C`, `P`) | | `min_dte` | query | integer | no | | | `max_dte` | query | integer | no | | | `min_premium` | query | number (double) | no | | | `min_volume` | query | integer | no | (min 0) | | `date` | query | string (date) | no | Target trading date (`YYYY-MM-DD`). Defaults to the **previous calendar day** (not the current trading date). | | `order_by` | query | string | no | (one of `oi_change`, `oi_change_pct`, `volume`, `premium`; default `oi_change`) | | `direction` | query | string | no | (one of `opening`, `closing`, `both`; default `both`) | | `only_sweeps` | query | boolean | no | | | `only_multi_leg` | query | boolean | no | | | `exclude_multi_leg` | query | boolean | no | | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/contract/unusual-oi" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Contracts ranked by OI change. Shape (placeholder values): ```json { "data": [ { "symbol": "string", "ticker": "string", "expiration": "string", "strike": 0, "right": "C", "dte": 0, "date": "string", "openInterest": 0, "prevOi": 0, "oiChange": 0, "oiChangePct": 0, "volume": 0, "premium": 0, "volumeOiRatio": 0, "bidVolume": 0, "askVolume": 0, "lastPrice": 0, "underlyingPrice": 0, "iv": 0, "positionType": "opening", "sweepVolume": 0, "sweepPremium": 0, "multiLegVolume": 0, "multiLegPremium": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/contract/bulk-contract-stats-for-a-list-of-symbols # Bulk contract stats for a list of symbols `GET https://flow-api.skylit.ai/v1/contract/bulk/stats` API: Flowseeker. Returns a single-day `ContractStats` record per requested OPRA symbol. Symbols absent from the response had no activity that day. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbols` | query | string | yes | Comma-separated OPRA symbols (max 50). | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/contract/bulk/stats?symbols=SPY__250516C00580000,SPY__250516P00580000" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Per-contract stats. Shape (placeholder values): ```json { "data": [ { "symbol": "string", "ticker": "string", "expiration": "string", "strike": 0, "right": "C", "dte": 0, "date": "string", "totalPremium": 0, "totalVolume": 0, "openInterest": 0, "oiChange": 0, "bidVolume": 0, "askVolume": 0, "midVolume": 0, "vwap": 0, "lastPrice": 0, "underlyingPrice": 0, "iv": 0, "tradeCount": 0, "sweepVolume": 0, "sweepPremium": 0, "multiLegVolume": 0, "multiLegPremium": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/contract/daily-stats-for-a-single-contract # Daily stats for a single contract `GET https://flow-api.skylit.ai/v1/contract/{symbol}/stats` API: Flowseeker. Credits: 1. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbol` | path | string | yes | OPRA option symbol in URL-safe form: `{ticker}__{YYMMDD}{C\|P}{strike×1000, 8 digits}` — the ticker and the 15-character contract block are joined by a **double underscore** (`__`). For example, an AAPL $250 call expiring 2026-01-17 is `AAPL__260117C00250000`. (A space-padded 21-char OCC form such as `AAPL 260117C00250000` is also accepted on some endpoints, but the `__` form is canonical and works across all contract routes.) | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/contract/SPY__250516C00580000/stats" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Stats for the contract on the requested date. Shape (placeholder values): ```json { "data": { "symbol": "string", "ticker": "string", "expiration": "string", "strike": 0, "right": "C", "dte": 0, "date": "string", "totalPremium": 0, "totalVolume": 0, "openInterest": 0, "oiChange": 0, "bidVolume": 0, "askVolume": 0, "midVolume": 0, "vwap": 0, "lastPrice": 0, "underlyingPrice": 0, "iv": 0, "tradeCount": 0, "sweepVolume": 0, "sweepPremium": 0, "multiLegVolume": 0, "multiLegPremium": 0 }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/contract/intraday-chart-bars-for-a-contract # Intraday chart bars for a contract `GET https://flow-api.skylit.ai/v1/contract/{symbol}/chart` API: Flowseeker. Credits: 3. Time-bucketed bars for a single contract — granular bid/mid/ask execution split, premium and volume per side, daily cumulative totals, VWAP, and (when available) IV and 30D average baselines. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbol` | path | string | yes | OPRA option symbol in URL-safe form: `{ticker}__{YYMMDD}{C\|P}{strike×1000, 8 digits}` — the ticker and the 15-character contract block are joined by a **double underscore** (`__`). For example, an AAPL $250 call expiring 2026-01-17 is `AAPL__260117C00250000`. (A space-padded 21-char OCC form such as `AAPL 260117C00250000` is also accepted on some endpoints, but the `__` form is canonical and works across all contract routes.) | | `interval` | query | string | yes | Trailing window — `{N}D` where N is 1–365 (e.g. `1D`, `7D`). | | `bucket` | query | string | yes | (one of `1min`, `5min`, `10min`, `15min`, `30min`, `1d`, `1w`) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/contract/SPY__250516C00580000/chart?interval=1D&bucket=" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Intraday bars for the contract. Shape (placeholder values): ```json { "data": [ { "timestamp": "string", "timestampEnd": "string", "belowBidVolume": 0, "bidVolume": 0, "aboveBidVolume": 0, "midVolume": 0, "belowAskVolume": 0, "askVolume": 0, "aboveAskVolume": 0, "noSideVolume": 0, "candleVolume": 0, "candleVolumeNoMl": 0, "candlePremium": 0, "belowBidPremium": 0, "bidPremium": 0, "aboveBidPremium": 0, "midPremium": 0, "belowAskPremium": 0, "askPremium": 0, "aboveAskPremium": 0, "noSidePremium": 0, "dailyVolume": 0, "dailyPremium": 0, "vwap": 0, "iv": 0, "avgVolume": 0, "avgPremium": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/contract/raw-enriched-trades-for-a-contract # Raw enriched trades for a contract `GET https://flow-api.skylit.ai/v1/contract/{symbol}/trades` API: Flowseeker. Same enriched trade shape as `/v1/underlying/{ticker}/trades`, scoped to a single OPRA contract. Because the contract is fixed, chain-level filters (moneyness, strike, DTE, expiration) do not apply here. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbol` | path | string | yes | OPRA option symbol in URL-safe form: `{ticker}__{YYMMDD}{C\|P}{strike×1000, 8 digits}` — the ticker and the 15-character contract block are joined by a **double underscore** (`__`). For example, an AAPL $250 call expiring 2026-01-17 is `AAPL__260117C00250000`. (A space-padded 21-char OCC form such as `AAPL 260117C00250000` is also accepted on some endpoints, but the `__` form is canonical and works across all contract routes.) | | `start` | query | string | no | Lower time bound — RFC 3339 or Unix seconds. Defaults to start-of-trading-day. | | `end` | query | string | no | Upper time bound — RFC 3339 or Unix seconds. Defaults to now. | | `limit` | query | integer | no | (default `50`; min 1; max 500) | | `only_sweeps` | query | boolean | no | | | `only_multi_leg` | query | boolean | no | | | `exclude_multi_leg` | query | boolean | no | | | `min_premium` | query | number (double) | no | (min 0) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/contract/SPY__250516C00580000/trades" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Enriched trades for the contract. Shape (placeholder values): ```json { "data": [ { "date": 0, "tsEvent": 0, "tsEventUs": 0, "instrumentId": 0, "rawSymbol": "SPY 250516C00580000", "ticker": "SPY", "expiration": 0, "strike": 0, "right": "C", "dte": 0, "price": 0, "size": 0, "side": "BB", "publisherId": 0, "bidPx": 0, "askPx": 0, "bidSz": 0, "askSz": 0, "neutralSz": 0, "totalPremium": 0, "spread": 0, "underlyingPrice": 0, "iv": 0, "moneyness": "ITM", "moneynessPercent": 0, "openInterest": 0, "prevOi": 0, "prevClose": 0, "prevCloseAge": 0, "priceChange": 0, "dailyVolume": 0, "sweepTrade": false, "blockTrade": false, "multiLeg": false, "ivDirection": -1, "ingestionTimestamp": 0, "prevIv": 0, "nextIv": 0, "premiumPercentile": 0, "flowScore": 0, "chainBidPct": 0, "chainAskPct": 0, "contractBidPct": 0, "contractAskPct": 0, "aggCount": 0, "aggTotalPremium": 0, "aggTotalSize": 0, "mlSibling": false, "strategyGroupId": "string", "strategyType": "string", "strategyLegCount": 0, "earningsDte": 0, "nextEarningsDate": 0, "cacheMiss": false, "sector": "string", "industry": "string" } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/contract/daily-history-for-a-contract # Daily history for a contract `GET https://flow-api.skylit.ai/v1/contract/{symbol}/history` API: Flowseeker. Daily aggregates per trading day in `[startDate, endDate]` — total premium / volume, OI dynamics, bid/ask execution split, sweep and multi-leg shares, VWAP, last price, IV, and trade count. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbol` | path | string | yes | OPRA option symbol in URL-safe form: `{ticker}__{YYMMDD}{C\|P}{strike×1000, 8 digits}` — the ticker and the 15-character contract block are joined by a **double underscore** (`__`). For example, an AAPL $250 call expiring 2026-01-17 is `AAPL__260117C00250000`. (A space-padded 21-char OCC form such as `AAPL 260117C00250000` is also accepted on some endpoints, but the `__` form is canonical and works across all contract routes.) | | `start_date` | query | string (date) | yes | | | `end_date` | query | string (date) | yes | | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/contract/SPY__250516C00580000/history?start_date=&end_date=" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 One row per trading day. Shape (placeholder values): ```json { "data": [ { "date": "string", "totalPremium": 0, "totalVolume": 0, "openInterest": 0, "oiChange": 0, "oiChangePct": 0, "bidVolume": 0, "askVolume": 0, "midVolume": 0, "bidPct": 0, "askPct": 0, "sweepVolume": 0, "multiLegVolume": 0, "sweepPct": 0, "multiLegPct": 0, "vwap": 0, "lastPrice": 0, "underlyingPrice": 0, "iv": 0, "tradeCount": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/contract/relative-volume-bars-for-a-contract # Relative-volume bars for a contract `GET https://flow-api.skylit.ai/v1/contract/{symbol}/rvol` API: Flowseeker. Credits: 1. Same shape as `/v1/underlying/{ticker}/rvol` but scoped to a single contract. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbol` | path | string | yes | OPRA option symbol in URL-safe form: `{ticker}__{YYMMDD}{C\|P}{strike×1000, 8 digits}` — the ticker and the 15-character contract block are joined by a **double underscore** (`__`). For example, an AAPL $250 call expiring 2026-01-17 is `AAPL__260117C00250000`. (A space-padded 21-char OCC form such as `AAPL 260117C00250000` is also accepted on some endpoints, but the `__` form is canonical and works across all contract routes.) | | `interval` | query | string | no | Trailing window — `{N}D` where N is 1–365. (default `1D`) | | `bucket` | query | string | no | (one of `1min`, `5min`, `10min`, `15min`, `30min`, `1d`, `1w`; default `5min`) | | `avg_period` | query | string | no | Baseline lookback as `{N}d` (e.g. `14d`). Max 365 days. (default `14d`) | | `date` | query | string (date) | no | Trading date the request targets, in `YYYY-MM-DD`. Defaults to the current trading date (the most recent session that has settled enough data to be queryable). | | `order_by` | query | string | no | (one of `rvol`, `volume`, `premium`, `time`; default `time`) | | `order` | query | string | no | Sort direction. Defaults to `asc` when `order_by=time`, otherwise `desc`. (one of `asc`, `desc`) | | `limit` | query | integer | no | (min 1) | | `format` | query | string | no | (one of `full`, `summary`; default `full`) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/contract/SPY__250516C00580000/rvol" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 RVOL bars + aggregate stats for the contract. Shape (placeholder values): ```json { "data": { "bars": [ { "timestamp": "string", "timestampEnd": "string", "volume": 0, "premium": 0, "avgVolume": 0, "avgPremium": 0, "avgDaysCount": 0 } ], "stats": { "todayVolume": 0, "todayPremium": 0, "avgVolume": 0, "avgPremium": 0, "rvolVolume": 0, "rvolPremium": 0, "avgDaysCount": 0 } }, "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/dark-pool/paginated-off-exchange-trf-prints # Paginated off-exchange (TRF) prints `GET https://flow-api.skylit.ai/v1/dark-pool/trades` API: Flowseeker. Credits: 5. Server-side filtered dark-pool prints from the off-exchange tape (FINRA TRF). Defaults to **today (ET)** with a **$1,000,000** minimum notional (the blocks-by-default rule); pass `min_notional=0` for the full firehose. The trade-date span is capped at **31 days** per request — page with `limit`/`offset` or narrow the range for more. Prints carry **no side, BBO, or greeks**. Pagination state (`limit`, `offset`, `count`, `hasMore`) is returned in `meta`. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `tickers` | query | string | no | Comma-separated tickers to include (e.g. `AAPL,NVDA`). Omit for all names. | | `date` | query | string (date) | no | Single trade date (`YYYY-MM-DD`, ET). Defaults to today (ET). | | `date_start` | query | string (date) | no | Inclusive start of a trade-date range (`YYYY-MM-DD`, ET). Max span 31 days. | | `date_end` | query | string (date) | no | Inclusive end of a trade-date range (`YYYY-MM-DD`, ET). Max span 31 days. | | `time_start` | query | string | no | Inclusive lower bound of the time-of-day window (`HH:MM`, ET). | | `time_end` | query | string | no | Inclusive upper bound of the time-of-day window (`HH:MM`, ET). | | `min_notional` | query | number (double) | no | Minimum notional (USD). Defaults to 1,000,000. Pass 0 for the firehose. (default `1000000`) | | `max_notional` | query | number (double) | no | | | `min_size` | query | integer | no | (min 0) | | `max_size` | query | integer | no | (min 0) | | `min_price` | query | number (double) | no | | | `max_price` | query | number (double) | no | | | `sectors` | query | string | no | Comma-separated GICS sectors to include. | | `industries` | query | string | no | Comma-separated GICS industries to include. | | `venue` | query | string | no | Reporting venue filter. Omit for both. (one of `FINN`, `FINC`) | | `limit` | query | integer | no | Page size (server caps at 5000). (default `500`; min 1; max 5000) | | `offset` | query | integer | no | Row offset for pagination. (default `0`; min 0; max 50000) | | `order` | query | string | no | Sort by trade time. (one of `asc`, `desc`; default `desc`) | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/dark-pool/trades" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Paginated dark-pool prints for the requested filters. Shape (placeholder values): ```json { "data": [ { "timestamp": "2026-07-02T14:31:05.123Z", "ticker": "SPY", "price": 0, "size": 0, "notional": 0, "venue": "FINN", "sector": "string", "industry": "string" } ], "meta": { "timestamp": "string", "requestId": "d7574836", "limit": 0, "offset": 0, "count": 0, "hasMore": false } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/dark-pool/largest-individual-dark-pool-prints-for-a-ticker # Largest individual dark-pool prints for a ticker `GET https://flow-api.skylit.ai/v1/dark-pool/top-prints/{ticker}` API: Flowseeker. Credits: 3. The top-N largest individual off-exchange prints for `{ticker}` over a trailing window, ordered by notional descending. Each row is a single TRF print (not an aggregate), useful as a support/resistance anchor. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ticker` | path | string | yes | Underlying ticker symbol (uppercase, e.g. `SPY`, `AAPL`). | | `top_n` | query | integer | no | Number of largest prints to return. (default `5`; min 1; max 20) | | `lookback_days` | query | integer | no | Calendar-day trailing window. (default `45`; min 1; max 180) | | `as_of_date` | query | string (date) | no | Optional anchor date (`YYYY-MM-DD`); the window becomes `[as_of_date - lookback_days, as_of_date]`. Omit for a today-anchored window. | ## Example request ```bash curl "https://flow-api.skylit.ai/v1/dark-pool/top-prints/SPY" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Top-N largest prints for `{ticker}`, ordered by notional. Shape (placeholder values): ```json { "data": [ { "timestamp": "string", "price": 0, "notional": 0, "size": 0 } ], "meta": { "timestamp": "string", "requestId": "d7574836" } } ``` ### 400 Request validation failed. invalidParam: ```json { "error": { "code": "BAD_REQUEST", "message": "Invalid parameter 'timeframe': must be one of [1m, 5m, 15m, 1h, 4h, 1d, 1w, 1M]" } } ``` ### 401 Missing or invalid API key. missingKey: ```json { "error": { "code": "UNAUTHORIZED", "message": "Authentication required" } } ``` ### 402 The account's shared Skylit credit balance is lower than this route's cost. Top up to continue. Carries `X-Credits-Remaining: 0`. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits. Top up to continue making requests." } } ``` ### 403 API key invalid, revoked or expired, or the account's API access is suspended (`account_suspended`). accountSuspended: ```json { "error": { "code": "account_suspended", "message": "API access has been suspended for this account. Contact support." } } ``` ### 404 Unknown resource (ticker / sector / window with no data). noData: ```json { "error": { "code": "NOT_FOUND", "message": "No trades found for AAPL on 2026-05-27 with timeframe 1d" } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. tooFast: ```json { "error": { "code": "RATE_LIMITED", "message": "Rate limit of 100 req/min exceeded. Retry after 18s." } } ``` ### 503 Underlying data source temporarily unavailable, or the credit balance could not be verified (`credit_check_failed`). Safe to retry. ingestionLag: ```json { "error": { "code": "UNAVAILABLE", "message": "Live feed is degraded; please retry in a few seconds." } } ``` creditCheckFailed: ```json { "error": { "code": "credit_check_failed", "message": "Could not verify credit balance. Please retry." } } ``` --- Source: https://www.skylit.ai/docs/api-reference/meta/this-openapi-specification-as-json-flowseeker # This OpenAPI specification, as JSON `GET https://flow-api.skylit.ai/v1/openapi.json` API: Flowseeker. ## Authentication The spec marks this operation as not requiring authentication. ## Example request ```bash curl "https://flow-api.skylit.ai/v1/openapi.json" ``` ## Responses ### 200 OpenAPI 3.1 document for the Flowseeker public API. Shape (placeholder values): ```json {} ``` --- Source: https://www.skylit.ai/docs/atlas/drawing-presets # Drawing Presets > Save your drawing styles as named presets that sync across devices — Fibonacci level sets, line styles, and defaults for every new drawing. Drawing presets let you save a drawing's full configuration under a name and reuse it anywhere. Set up your Fibonacci levels once — ratios, colors, fills, line style, extensions — save it as a preset, and every device signed into your Skylit account can apply it with one click. ![A Golden Pocket preset applied to a Fibonacci drawing, with fills extended right into developing price](https://www.skylit.ai/docs/images/atlas-drawing-presets-golden-pocket.webp) Presets exist for two families of tools: | Preset type | Tools covered | What gets saved | | --- | --- | --- | | Fibonacci | Fib retracement | Level ratios, per-level colors and visibility, fills and fill opacity, line width and style, extensions, trend line, label options, log scale, reverse | | Line style | Trendline, rectangle, arrow, horizontal line, horizontal ray, vertical line, brush | Color, line width, line style, opacity | ![The Fibonacci panel with the preset controls at the top](https://www.skylit.ai/docs/images/atlas-drawing-presets-panel.webp) ## Where to find presets Select any drawing on the chart and its style toolbar appears. - **Fibonacci drawing selected** — the Fibonacci button on the toolbar shows the active preset's name next to the icon. Click it to open the Fibonacci panel; the preset controls sit at the top, above the level editor. - **Line-style drawing selected** — the Line style button works the same way: it carries the active preset's name and opens a compact preset panel. > **Note:** Presets are saved to your Skylit account — they belong to you, not to any single chart or layout, and follow you across every device you sign into. ## The preset controls | Control | What it does | | --- | --- | | Preset dropdown | Applies the chosen preset to the selected drawing and makes it your active preset. Choose **Built-in defaults** to reset the drawing to the stock configuration. | | Save as… | Saves the selected drawing's current configuration as a new named preset and makes it active. | | Update | Overwrites the active preset with the drawing's current configuration. Enabled only when the drawing actually differs from the preset. | | Star | Marks the preset as the default for **all** new drawings — it takes priority over the active selection. Click again to unstar. | | Delete | Removes the preset from your account. | ![The preset dropdown with named presets and the starred default](https://www.skylit.ai/docs/images/atlas-drawing-presets-dropdown.webp) ## The unsaved-changes dot When your selected drawing drifts from its preset — a level ratio edited, a different line width, an extension toggled — a dot appears next to the preset name on the toolbar button, and **Update** lights up in the panel. ![A modified drawing: the dot next to the preset name and the enabled Update button signal unsaved changes](https://www.skylit.ai/docs/images/atlas-drawing-presets-dirty.webp) - **Dot visible** — the drawing no longer matches the preset. Click **Update** to save the changes into the preset, or re-apply the preset from the dropdown to discard them. - **No dot, Update disabled** — the drawing matches the preset exactly. Nothing to save. > **Tip:** Update's disabled state doubles as a saved indicator: if you can't click it, your preset already reflects what's on the chart. Edits never save into a preset automatically. Changing a drawing changes that drawing only — other drawings using the same preset keep their look, and the preset itself changes only when you click **Update**. ## Defaults for new drawings Every new drawing starts from the first match in this order: 1. **Starred preset** — the preset you've marked with the **Star** control. It's your house-style default and always wins, so new drawings come out styled no matter what's selected in the dropdown. 2. **Active preset** — whatever is currently selected in the preset dropdown, used only when no preset is starred. 3. **Built-in defaults** — the stock configuration. Star the preset you want as your house style and every new Fibonacci or line drawing comes out styled without any setup. The star stays in charge until you unstar it or delete the preset — selecting a different preset (or **Built-in defaults**) restyles the drawing you have selected, but doesn't change what new drawings start from. ## Applying a preset Applying a preset makes the selected drawing match it exactly — every setting the preset covers is restored, including settings you changed since. Right after applying, the drawing is in sync with the preset and Update is disabled. > **Warning:** Applying a preset restyles the selected drawing only. Drawings already on your charts keep their own configuration — select one and re-apply the preset if you want it updated too. ## A note on Fibonacci colors Fibonacci drawings color each level individually — those per-level colors live in the preset. The general drawing color swatch does not apply to Fibonacci drawings, which is why the color picker is not shown on the toolbar while a Fibonacci drawing is selected. For line-style presets, color is part of the preset. ## Sync and limits - Presets sync across all devices signed into the same Skylit account. A preset saved on desktop is available on mobile immediately. - If the same account edits presets on two devices at once, the most recent save wins. - Accounts can store up to 50 presets across both preset types. --- Source: https://www.skylit.ai/docs/atlas/indicators/gex-vwap # GEX VWAP > Where dealer positioning is centred on the option board, drawn on the Atlas chart as a centre line with an optional band and envelope. GEX VWAP draws the **centre of gravity of dealer positioning** directly on the price chart. Every minute, Atlas reads the option board behind the heatmap and marks where its positioning is centred. The result is a line that tracks where the board's weight sits, updated minute by minute through the session. Despite the name, this is **not a volume VWAP**. It is built from the same positioning data that powers Heatseeker and the Orbs, not from traded share volume. Price VWAP answers "where has volume traded" — GEX VWAP answers "where is the positioning centred." ## Adding the indicator Open the chart settings panel and use the **Add** button in the Indicators section. GEX VWAP appears in the list alongside the moving averages and the other Skylit studies. Each instance gets its own settings cog and can be removed the same way. ## The lines | Line | What it is | | --- | --- | | Centre | Where positioning is centred across the selected board. | | Upper | Where the weight sits on the side of the board **above** the centre. | | Lower | Where the weight sits on the side of the board **below** the centre. | | Envelope (optional) | Two levels marking how far the band has reached over a chosen window. | Together the upper and lower lines show how the weight is spread on each side of the centre. A minute where no board data exists renders as a gap rather than a stale value. ## Settings | Setting | Options | What it controls | | --- | --- | --- | | Expirations | **Front only** (default), 1W, 1M, 3M, 6M, All | Which expirations of the board feed the lines. Front only uses the current expiration — the same board the Orbs draw by default. Wider windows fold in further-dated exposure. | | Nodes | **All** (default), P50, P40, P30, P25, P20 | Which strikes feed the lines. All folds every strike on the board. A P-value folds only the strikes whose exposure is at least that percent of the King Node — the same percent-of-king vocabulary as the GEX Nodes dropdown — so the lines track the drawn orb cluster instead of the full board. | | Band | Band + centre, Centre only | Show the upper/lower lines around the centre, or the centre line alone. | | Envelope | Off (default), Opening window, Session | Draws two levels at the extremes the band has reached. **Opening window** measures the first N minutes after the 09:30 ET open (default 15, configurable 8–60) and freezes once the window closes. **Session** runs from the open and only widens through the day. | On SPXW, an additional **Trinity combine** option folds SPY and QQQ exposure into a unified SPX-priced board. It is SPXW-only because the combined board is priced in SPX terms. ## Reading notes - The lines are computed fresh each minute from that minute's board — they are not smoothed and carry no memory, so a sudden repositioning of the board moves them immediately. - The centre is not a price target or a signal. It marks where positioning is centred so you can see, at a glance, whether the weight sits above or below the market and how that gap evolves through the session. - The Opening-window envelope needs at least 8 minutes of board data inside its window; a session that opens without enough data draws no envelope rather than a misleading one. --- Source: https://www.skylit.ai/docs/atlas/indicators/vwap # VWAP > The volume-weighted average price, with up to three deviation bands, anchored to the session, week, month, quarter or year. VWAP marks **the average price every share actually traded at** since the anchor started — each bar's price weighted by the volume that went through it. It is the level institutional desks measure their own fills against, which is what makes it a reference rather than a signal: price above it means buyers have paid up relative to the session's own average, price below it means they haven't. This is the classic price VWAP, and it is **not** the GEX VWAP that sits beside it in the Add menu. That one tracks where dealer positioning is centred on the option board. This one weights price by traded volume. Same word, different instrument. ## Adding the indicator Open the chart settings panel and use the **Add** button in the Indicators section. Each instance gets its own settings cog and can be removed the same way, and you can run more than one at different anchors. ## Settings | Setting | Options | What it controls | | --- | --- | --- | | Anchor | **Session** (default), Week, Month, Quarter, Year | When the running sum resets. Session restarts each trading day; the wider anchors carry the average across the whole period. | | Source | **hlc3** (default), Close | The price each bar contributes. `hlc3` is the average of the high, low and close — the classic choice, and steadier than the close alone on a wide bar. | | Bands | Up to three pairs, off by default | Each pair draws above and below the centre line, with its own colour and a soft fill. | | Band basis | **Standard deviation** (default), Percent | Volume-weighted σ, or a fixed percent offset from the line. | | Multipliers | 1, 2, 3 by default | How far each pair sits from the centre, in σ or in percent. | ## Reading notes - **Sessions stay connected across an anchor reset.** At the boundary the line jumps rather than breaking — the same way TradingView draws it. A vertical step is the reset, not a gap in the data. - **The forming bar's value is provisional.** It folds whatever volume has printed so far in that bar, so it firms up as the bar closes. It never invents a value it cannot compute. - **SPXW has no traded volume of its own** — the index itself doesn't trade. Its VWAP pairs SPXW's prices with **ES futures** volume, the instrument that actually trades the index, rather than an ETF stand-in. On 4h and daily anchors that weighting deliberately uses the full futures session rather than regular hours only, since a bar that wide already spans well past the cash close. - **Replay is fully supported.** Scrub back to any day and the VWAP builds bar by bar with the tape, including its bands. --- Source: https://www.skylit.ai/docs/atlas/indicators/cvd # Cumulative Volume Delta > The running buy-minus-sell volume since the anchor started, drawn as delta candles in its own pane, computed from true trade sides. CVD draws **the running total of buying minus selling volume** since the anchor started, as candles in their own pane. It answers a question price alone cannot: whether a move is being carried by real aggressive flow or drifting on thin participation. Price making a new high while CVD does not is the classic divergence traders watch for. Unlike TradingView's CVD, which has to **estimate** each bar's split from whether it closed up or down, ours reads the **true side of every trade** off the tape. The delta you read is the delta that actually traded. ## Adding the indicator Open the chart settings panel and use the **Add** button in the Indicators section. CVD gets its own pane below the chart, with its own price axis. ## Settings | Setting | Options | What it controls | | --- | --- | --- | | Anchor | **Session** (default), Week, Month, Quarter, Year | When the running total resets to zero. | | MA | **On** (default), Off | A moving average over the delta, drawn in front of the candles. | | MA type | **SMA** (default), EMA | How that average is computed. | | MA period | **20** (default) | Its lookback in bars. | ## Reading the pane | Element | What it is | | --- | --- | | Candles | Each bar's delta, opening where the previous one closed — so the body is that bar's own contribution and the line of closes is the running total. | | Zero line | A dashed level at zero, so a sign flip is obvious at a glance. | | Axis badge | The current running delta, on the pane's own price axis. | ## Reading notes - **Every period opens at zero**, and within a period each candle opens exactly where the last one closed. There are no hidden jumps. - **A bar with no data emits no candle at all.** Absence stays visible rather than being drawn as a fake flat stretch. - **CVD and the Volume pane can never disagree** about the same bar — both read the identical reconciled buy/sell figures, so a delta here always matches the net of the stack there. - **The forming candle's wicks hold their extremes** through the sub-second updates that build them, rather than retracting as both sides grow. On intervals above one minute an intra-minute extreme can still settle back once that minute closes: sided volume is minute-granular, and the pane will not claim more precision than the data has. - **SPXW reads ES futures flow**, for the same reason VWAP does — the index has no trades of its own. - **Replay is fully supported**; the delta builds minute by minute as you play the day back. --- Source: https://www.skylit.ai/docs/atlas/indicators/volume-profile # Volume Profile > A price-by-price histogram of where volume actually traded, with the Point of Control and a shaded Value Area. Volume Profile turns the chart on its side: instead of volume per bar, it shows **volume per price** — a histogram anchored to the right edge, one row per price band, over whatever lookback you set. Where the rows are long, the market spent size; where they are short, it passed through. Those thin patches are the levels price tends to travel back across quickly. Two levels are marked on it. The **Point of Control** is the single busiest price in the window. The **Value Area** is the band around it holding the chosen share of the window's volume — 68% by default — with its upper and lower bounds badged on the price axis as VAH and VAL. ## Adding the indicator Open the chart settings panel and use the **Add** button in the Indicators section. The profile draws behind the candles so it never hides price action. ## Settings | Setting | Options | What it controls | | --- | --- | --- | | Lookback | **Fixed depth** (default), Visible range | Profile a set number of bars back, or whatever is currently on screen — the visible-range mode rebuilds as you scroll and zoom. | | Depth | **200** bars (default) | How far back fixed mode reaches. Disabled under visible range, which takes its window from the viewport. | | Levels | The row count | How finely the price axis is divided. More rows resolve more structure; fewer read more cleanly. | | Volume | **Total** (default), Buy, Sell | Which side to profile. | | Value Area | **68%** (default) | The share of window volume the area must hold. | | Width | A share of the pane | How far the longest row reaches across the chart. | | Show POC / VA / VAH-VAL | On by default | The level lines and their axis badges. | ## Reading notes - **Buy and Sell profiles are real, not estimated.** Because the tape carries true trade sides, profiling one side alone shows where that side actually transacted — something a profile built from bar direction cannot offer. - **A bar's volume is spread across the rows its range covers**, in proportion to how much of the bar sits in each. A bar that closes in one row lands wholly in that row. - **Ties resolve downward for the Point of Control** and upward when the Value Area expands, matching the reference implementation traders will have used elsewhere. - **A sparse profile's Value Area can stop short of the target percentage.** When the rows on both sides of the area hold no volume at all, it stops there rather than reaching across a gap to manufacture the number. - **Replay is supported**: the profile fills in level by level as the day unfolds. --- Source: https://www.skylit.ai/docs/atlas/indicators/tpo # TPO (Market Profile) > A letter-per-bar Market Profile with Point of Control, Value Area, single prints, an Initial Balance, and persisting naked levels. TPO builds the classic **Market Profile**: for every bar, a letter is stamped onto each price row that bar traded through. Rows visited often grow wide; rows the market passed through once stay a single character. What the profile measures is **time at price**, not volume — which is what separates it from Volume Profile sitting beside it in the Add menu. A price can hold size in one print, or hold the market for an hour; those are different facts, and this is the one that shows the second. The shape is the point. A balanced session builds a bell around a middle it keeps returning to; a trend session builds a thin, elongated profile that barely revisits anything. ## Adding the indicator Open the chart settings panel and use the **Add** button in the Indicators section. One TPO instance can be active per chart. ## What it draws | Element | What it is | | --- | --- | | Letters | One per bar per row touched. Each period gets the next letter, so the alphabet reads as the session's clock. | | POC | The Point of Control — the row with the most letters, in yellow. | | Value Area | The band around the POC holding the bulk of the session's time, its letters picked out and the area shaded. | | Single prints | Rows touched exactly once — the thin patches a market usually revisits. | | Initial Balance | The range of the session's opening window. | | Naked levels | POC, Value Area and single-print levels from earlier sessions that price has **not** traded back through since. They persist until it does. | ## Settings | Setting | Options | What it controls | | --- | --- | --- | | Type | **Regular** (default), Fixed Range, Fixed Interval | Recalculate every N periods, profile one explicit window, or profile a recurring daily time window. | | Period / Unit | **1 day** (default) | How often Regular starts a fresh profile — in minutes, days, weeks or months. | | Range start | Blank by default | Where a Fixed Range profile begins. Blank means the most recent session. | | Interval start / end | 13:00–17:00 ET | The recurring window Fixed Interval profiles each day. | | Row size | **Auto** (default), Custom | Auto sizes rows from the instrument's own recent range, aiming for a readable profile on any symbol. Custom sets the row height in ticks. | | Prev Sessions / Ranges / Black Box | On, on, off | How much of the completed sessions to the left stays drawn. | | SP Lines, FR Marker, Tick Levels | | The single-print lines, the Fixed Range start marker, and per-row gridlines. | | Hide distance % | **5** | Naked levels further than this from the last price are hidden, so only the ones in play are drawn. | | Text, Font, Colours | | Letter size and family, and a colour per element. | ## Reading notes - **Auto row size targets a row count, not a tick count.** A fixed tick height that reads well on a penny-tick equity collapses a quarter-tick futures profile into three rows; sizing from the instrument's own range keeps the profile legible on both. - **POC and single prints appear from the fifth period.** Before that there is not enough of a profile for either to mean anything, so the letters draw alone. - **On daily and higher charts the profile is a composite**: one bar is one period, so a blank Range start profiles the last twenty bars — roughly a month on a daily chart — one letter per day. - **A completed session's naked levels appear once the next session opens**, since a level only counts as untouched after the session that made it has ended. - **Replay is supported**, including historically correct naked levels at any point in the day. --- Source: https://www.skylit.ai/docs/api-reference/history/ohlcv-price-bars-for-a-symbol-and-resolution # OHLCV price bars for a symbol and resolution `GET https://atlas-api.skylit.ai/v1/history` API: Atlas. Credits: 1. TradingView UDF history bars for one `symbol` at one `resolution`, covering `[from, to)` (Unix seconds; `to` is exclusive). Returns column arrays (`t`, `o`, `h`, `l`, `c`, `v`) of equal length, oldest-first. When the window holds no bars the response is a `200` with `{ "s": "no_data" }` (plus `nextTime` pointing at the nearest earlier bar when one exists), per the UDF contract. Equity bars also carry sided-volume columns (`bv`/`sv`/`uv` = buy / sell / unclassified) where available. ## Request-window limit One call may span at most a fixed number of **trading days**, set by the bar tier the resolution reads from — not by the resolution itself. `240` and `60` share the 1-hour tier and therefore share its allowance. | Tier | Resolutions | Max trading days / request | |--------|----------------------------|---------------------------:| | 1-min | `1` `2` `3` `5` `15` `30` | 90 | | 1-hour | `60` `240` `480` | 720 | | 1-day | `D` `W` | 2,600 | A window **wider than the cap is rejected with `400`**, carrying the two numbers a client needs to react (`requested_days`, `max_days`). It is never silently shortened — a short `{ "s": "ok" }` always means the data ends there, never that your range was clipped. Page through anything wider in windows of `max_days` or fewer. A rejected `400` is refunded (failed calls are free). The caps are fixed and published here, so check your range before sending it rather than discovering the limit by retrying. `/v1/config` is free if you would rather read the feed's capabilities first. Cache-Control tracks data freshness: today `max-age=2`, the prior session `max-age=60`, older complete days `immutable`. A `400` is `no-store`. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbol` | query | string | yes | Ticker (e.g. `SPY`). | | `resolution` | query | string | yes | Bar size. Intraday minutes or `D`/`W`. (one of `1`, `2`, `3`, `5`, `15`, `30`, `60`, `240`, `480`, `D`, `W`) | | `from` | query | integer (int64) | yes | Window start, Unix seconds (UTC). | | `to` | query | integer (int64) | yes | Window end, Unix seconds (UTC). | | `countback` | query | integer | no | When set, return exactly this many bars ending at `to` (takes precedence over `from`, per the UDF spec). (min 1) | | `extended` | query | boolean | no | Include extended-hours (pre / post-market) bars. Default is regular trading hours only (09:30–16:00 ET). (default `false`) | ## Example request ```bash curl "https://atlas-api.skylit.ai/v1/history?symbol=SPY&resolution=D&from=1748131200&to=1748736000" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Bars, or a `no_data` marker — both `200` per UDF. Headers: `X-Credits-Remaining`, `Cache-Control`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`. SPY daily (truncated): ```json { "s": "ok", "t": [ 1748304000, 1748390400, 1748476800 ], "o": [ 742.1, 744.02, 733.9 ], "h": [ 750.18, 745.61, 739.94 ], "l": [ 741.55, 732.88, 731.2 ], "c": [ 744.38, 733.68, 733.05 ], "v": [ 61230400, 74910200, 58120900 ] } ``` Empty window: ```json { "s": "no_data", "nextTime": 1746057600 } ``` ### 400 The requested range is wider than the resolution's tier allows. Refunded, like every failed call. Headers: `X-Credits-Remaining`, `Cache-Control`. 171 trading days asked of the 90-day 1-minute tier: ```json { "s": "error", "errmsg": "requested range spans 171 trading days; resolution \"1\" allows at most 90 per request. Narrow the range, or page through it in windows of 90 trading days or fewer.", "requested_days": 171, "max_days": 90 } ``` ### 401 Missing or invalid API key. ### 402 Credit balance is below the request cost. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits." } } ``` ### 403 Account is not API-eligible (suspended). suspended: ```json { "error": { "code": "account_suspended", "message": "Account suspended." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. ### 503 The credit ledger or datafeed is temporarily unavailable. --- Source: https://www.skylit.ai/docs/api-reference/symbols/search-symbols # Search symbols `GET https://atlas-api.skylit.ai/v1/search` API: Atlas. Credits: 1. Ranked symbol search for the datafeed's symbol picker (exact ticker > prefix > substring). Returns up to `limit` matches. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `query` | query | string | yes | Search text (ticker or name fragment). | | `limit` | query | integer | no | Max results. (default `25`; min 1; max 500) | ## Example request ```bash curl "https://atlas-api.skylit.ai/v1/search?query=SP" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Matching symbols. Headers: `X-Credits-Remaining`, `Cache-Control`. spy: ```json [ { "symbol": "SPY", "ticker": "SPY", "description": "SPDR S&P 500 ETF Trust", "exchange": "ARCA", "type": "etf" }, { "symbol": "SPX", "ticker": "SPX", "description": "S&P 500 Index", "exchange": "NASDAQ", "type": "index" } ] ``` ### 401 Missing or invalid API key. ### 402 Credit balance is below the request cost. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits." } } ``` ### 403 Account is not API-eligible (suspended). suspended: ```json { "error": { "code": "account_suspended", "message": "Account suspended." } } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. --- Source: https://www.skylit.ai/docs/api-reference/symbols/resolve-a-symbol # Resolve a symbol `GET https://atlas-api.skylit.ai/v1/symbols` API: Atlas. Credits: 1. The TradingView `LibrarySymbolInfo` for one ticker — price scale, session, timezone, and supported resolutions the charting library needs before requesting history. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `symbol` | query | string | yes | Ticker (e.g. `SPY`). | ## Example request ```bash curl "https://atlas-api.skylit.ai/v1/symbols?symbol=SPY" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Symbol info. Headers: `X-Credits-Remaining`. spy: ```json { "ticker": "SPY", "name": "SPY", "description": "SPDR S&P 500 ETF Trust", "type": "etf", "session": "0930-1600", "timezone": "America/New_York", "exchange": "ARCA", "minmov": 1, "pricescale": 100, "has_intraday": true, "has_daily": true, "has_weekly_and_monthly": true, "intraday_multipliers": [ "1", "60" ], "supported_resolutions": [ "1", "2", "3", "5", "15", "30", "60", "240", "480", "D", "W" ], "volume_precision": 0, "data_status": "streaming", "format": "price" } ``` ### 400 Malformed symbol. invalid: ```json { "success": false, "error": "invalid symbol" } ``` ### 401 Missing or invalid API key. ### 402 Credit balance is below the request cost. Headers: `X-Credits-Remaining`. outOfCredits: ```json { "error": { "code": "insufficient_credits", "message": "Out of credits." } } ``` ### 403 Account is not API-eligible (suspended). suspended: ```json { "error": { "code": "account_suspended", "message": "Account suspended." } } ``` ### 404 Unknown symbol. notFound: ```json { "success": false, "error": "symbol not found" } ``` ### 429 Per-minute rate limit exceeded. Headers: `Retry-After`. --- Source: https://www.skylit.ai/docs/api-reference/meta/datafeed-configuration # Datafeed configuration `GET https://atlas-api.skylit.ai/v1/config` API: Atlas. Credits: 0. The static UDF `DatafeedConfiguration` — supported resolutions, exchanges, symbol types, and feature flags. Free. Also carries **`max_fetch_trading_days`**: the `/v1/history` request-window cap, keyed by every advertised resolution. Read it once at startup and size your history pages from it, rather than hardcoding a window that later drifts — or discovering the limit by being rejected, which costs a credit each time. This call is free precisely so the limit is knowable in advance. The values are served from the same limits the server enforces, so they cannot disagree with it. A charting client can ignore the field: it is not part of the UDF spec, and TradingView skips config keys it does not recognise. ⚠ Cached for an hour (`max-age=3600`), so treat a `400` naming a `max_days` SMALLER than your cached value as authoritative and re-read this endpoint. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Example request ```bash curl "https://atlas-api.skylit.ai/v1/config" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Datafeed configuration. config: ```json { "supports_search": true, "supports_group_request": false, "supports_marks": false, "supports_timescale_marks": false, "supports_time": true, "supported_resolutions": [ "1", "2", "3", "5", "15", "30", "60", "240", "480", "D", "W" ], "max_fetch_trading_days": { "1": 90, "2": 90, "3": 90, "5": 90, "15": 90, "30": 90, "60": 720, "240": 720, "480": 720, "D": 2600, "W": 2600 }, "intraday_multipliers": [ "1", "60" ], "exchanges": [ { "value": "NASDAQ", "name": "NASDAQ", "desc": "NASDAQ" }, { "value": "NYSE", "name": "NYSE", "desc": "NYSE" }, { "value": "ARCA", "name": "NYSE ARCA", "desc": "NYSE ARCA" } ], "symbols_types": [ { "name": "stock", "value": "stock" }, { "name": "fund", "value": "fund" }, { "name": "dr", "value": "dr" }, { "name": "index", "value": "index" }, { "name": "futures", "value": "futures" } ] } ``` ### 401 Missing or invalid API key. --- Source: https://www.skylit.ai/docs/api-reference/meta/server-time # Server time `GET https://atlas-api.skylit.ai/v1/time` API: Atlas. Credits: 0. Current server time as a Unix-seconds integer (UDF `/time`). Free. ## Authentication Send your Skylit API key as a bearer token: `Authorization: Bearer `. No other header is accepted. ## Example request ```bash curl "https://atlas-api.skylit.ai/v1/time" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ## Responses ### 200 Unix seconds. Shape (placeholder values): ```json 1748736123 ``` ### 401 Missing or invalid API key. --- Source: https://www.skylit.ai/docs/mcp/docs-mcp # Docs MCP > Let Claude, Cursor, VS Code or any MCP client search and read these docs. Free, no API key. The **Docs MCP** server gives your AI tool these docs: every field guide, concept, pattern and reference page. Your assistant answers from Skylit's own documentation instead of from memory. > **Note:** This is not the [Skylit MCP server](https://www.skylit.ai/docs/mcp/overview). The Docs MCP only reads > documentation: it is free, needs no API key and uses no credits. The Skylit MCP > server serves live market data (Flowseeker and Heatseeker), needs an API key and is > in Beta. | | | | --- | --- | | **Endpoint** | `https://www.skylit.ai/docs/mcp` | | **Auth** | None | | **Tools** | `search_docs`, `get_page`, `list_pages` | ## Connect it ### Claude Code ```bash claude mcp add --transport http skylit-docs https://www.skylit.ai/docs/mcp ``` ### Claude Desktop In **Settings → Connectors → Add custom connector**, paste the endpoint: ``` https://www.skylit.ai/docs/mcp ``` No authentication is needed. (Custom connectors require a Claude plan that supports them.) ### Cursor Open any docs page, choose the menu next to **Copy page**, then **Add docs to Cursor**. Or add it to `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` in a project: ```json { "mcpServers": { "skylit-docs": { "url": "https://www.skylit.ai/docs/mcp" } } } ``` ### VS Code Open any docs page, choose the menu next to **Copy page**, then **Add docs to VS Code**. It installs a server named `skylit-docs` of type `http` with the endpoint above. ## What it can do | Tool | What it does | | --- | --- | | `search_docs` | Finds the best-matching sections for a query, with a snippet and a link to each. Optionally limited to one area (Platform, Heatseeker, Flowseeker, Atlas, Nexus, Tempest, Talon or Developers). | | `get_page` | Returns one page as Markdown, from a search result's path or URL. | | `list_pages` | Lists every page with a one-line summary (the same index as [llms.txt](https://www.skylit.ai/docs/llms.txt)). | Once connected, ask your assistant something like *"Using the Skylit docs, what is a King Node?"* and it searches the docs and links the pages it used. ## Other ways to read the docs - Every page is available as Markdown: add `.md` to its URL. - [llms.txt](https://www.skylit.ai/docs/llms.txt) indexes every page, and [llms-full.txt](https://www.skylit.ai/docs/llms-full.txt) has them all in one file. --- Source: https://www.skylit.ai/docs/api-reference/introduction # API Reference > Skylit's real-time options-Greeks heatmaps as a versioned HTTP API. > **Beta.** The API and MCP server are open to invited members. If you were invited, create your key on the [Developer page](https://app.skylit.ai/developer). The **Skylit Public API** exposes the same real-time options-Greeks (gamma / vanna) heatmaps that power Heatseeker — per strike, with the live velocity metric and Skylit's node classification (King, Gatekeeper, Pika, Barney, and more). - [Live heatmap](https://www.skylit.ai/docs/api-reference/heatmap/live-per-strike-heatmap-one-or-more-symbols): Current per-strike heatmap for one or more symbols, including live `velocityPct`. - [Historical replay](https://www.skylit.ai/docs/api-reference/heatmap/replay-per-strike-heatmap-at-a-past-instant-one-or-more-symbols): The snapshot nearest any past instant — up to 365 days back. - [Live stream (SSE)](https://www.skylit.ai/docs/api-reference/heatmap/live-sse-stream-one-symbol-per-connection): A Server-Sent Events feed of live heatmap updates, one symbol per connection. - [Authentication](https://www.skylit.ai/docs/api-reference/authentication): Bearer API keys, credit metering, and rate limits. - [Use it over MCP](https://www.skylit.ai/docs/mcp/overview): Every endpoint here is also an MCP tool (`heat_*`) — query it from Claude or Cursor in natural language, same key and credits. ## Base URL ```bash https://api.skylit.ai ``` ## Quickstart ### 1. Get an API key Generate a key from your [account console](https://app.skylit.ai). New accounts are seeded with **5,000 credits**. ### 2. Fetch a live heatmap Pull the current per-strike gamma heatmap for SPY: ```bash cURL curl "https://api.skylit.ai/v1/heatmap?symbols=SPY&metric=gamma" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ```python Python import requests r = requests.get( "https://api.skylit.ai/v1/heatmap", params={"symbols": "SPY", "metric": "gamma"}, headers={"Authorization": "Bearer YOUR_API_KEY"}, ) print(r.json()["data"]["symbols"][0]["strikes"][:3]) ``` ```javascript Node const res = await fetch( "https://api.skylit.ai/v1/heatmap?symbols=SPY&metric=gamma", { headers: { Authorization: "Bearer YOUR_API_KEY" } }, ); const { data } = await res.json(); console.log(data.symbols[0].strikes.slice(0, 3)); ``` ### 3. Go cross-asset Comma-separate symbols for a single **Trinity** call — `symbols=SPY,SPX,QQQ` — and each comes back as an element of `data.symbols`. ## How responses look Every success returns a `data` / `meta` envelope; errors return an `error` object. Fields are camelCase. ```json { "data": { "symbols": [ { "symbol": "SPY", "asOf": "2026-05-22T14:31:00Z", "spot": 591.23, "strikes": [ { "strike": 590, "value": 1894300.4, "nodeType": "king", "velocityPct": 12.4 }, { "strike": 595, "value": 642100.2, "nodeType": "gatekeeper", "velocityPct": -3.1 } ] } ] }, "meta": { "metric": "gamma", "resolution": "1m", "mode": "live", "cached": false } } ``` - **Node types** (king · gatekeeper · pika · barney · significant · normal): Each strike carries Skylit's node classification — the same vocabulary used throughout [Patternpedia](https://www.skylit.ai/docs/patternpedia/pattern-the-whipsaw). - **velocityPct** (live only): Present on `/v1/heatmap`; omitted on `/v1/historical` (velocity is a live metric). - **Credits** (metered per request): `/v1/heatmap` costs 1, `/v1/historical` costs 5, `/v1/stream` 1 per minute open. Every response carries `X-Credits-Remaining`. See [Authentication](https://www.skylit.ai/docs/api-reference/authentication). --- Source: https://www.skylit.ai/docs/api-reference/authentication # Authentication > Authenticate with a Skylit API key, and how credits and rate limits work. > **Beta.** The API and MCP server are open to invited members. If you were invited, create your key on the [Developer page](https://app.skylit.ai/developer). The Skylit Public API uses **bearer authentication**. Send your API key in the `Authorization` header on every request: ```bash Authorization: Bearer ``` > **Note:** REST endpoints read only the `Authorization` header. A request without it gets > `401 Authorization field missing`; an invalid, revoked or expired key gets `403`. > The MCP server uses the same header. `X-API-Key` and query-string keys are not > read (`401`). The gateway also accepts the bare key without the `Bearer ` prefix; > `Bearer` is the documented form. > **Warning:** Treat API keys like passwords. Never commit them to source control or expose them in > client-side code. Use environment variables and rotate keys if one leaks. ## Getting a key Generate and manage keys on the [Developer page](https://app.skylit.ai/developer) (API keys tab). New accounts are seeded with **5,000 credits**. ```bash cURL curl "https://api.skylit.ai/v1/heatmap?symbols=SPY" \ -H "Authorization: Bearer $SKYLIT_API_KEY" ``` ```python Python import os, requests session = requests.Session() session.headers["Authorization"] = f"Bearer {os.environ['SKYLIT_API_KEY']}" print(session.get("https://api.skylit.ai/v1/heatmap", params={"symbols": "SPY"}).json()) ``` ```javascript Node const skylit = (path) => fetch(`https://api.skylit.ai${path}`, { headers: { Authorization: `Bearer ${process.env.SKYLIT_API_KEY}` }, }).then((r) => r.json()); console.log(await skylit("/v1/heatmap?symbols=SPY")); ``` ## Credits Every chargeable request debits a fixed cost from your credit balance. | Endpoint | Cost | | --- | --: | | `/v1/heatmap` | 1 | | `/v1/gex/levels` | 1 | | `/v1/historical` | 5 | | `/v1/stream` | 1 to open + 1 per minute open | | `/v1/account`, `/v1/openapi.json` | 0 | Every chargeable response carries `X-Credits-Remaining: `. **Failed calls are free:** a request answered with any `4xx` or `5xx` is refunded, and its `X-Credits-Remaining` already reflects the refund. - **402 insufficient_credits**: You're out of credits. Contact support from the chat on [app.skylit.ai](https://app.skylit.ai) to add more (self-serve top-ups are coming). - **403 account_suspended**: The account has been administratively suspended. ## Rate limits A safety ceiling of **600 requests / minute** per key is enforced by the Skylit gateway. This is runaway protection, not your quota — credit metering does the per-customer accounting. The `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` headers describe the key's quota, which is unlimited (`-1`, `0`, `0`). They don't count toward the per-minute ceiling, so don't throttle on them. | Status | Meaning | | --- | --- | | `401 Unauthorized` | Missing or invalid API key. | | `403 Forbidden` | Key revoked/expired, or account suspended. | | `429 Too Many Requests` | Rate ceiling hit. The gateway's `429` has no `Retry-After`: back off and retry after the current minute. `429`s from the API itself (concurrency or stream limits) carry `Retry-After`. | - [Make your first call](https://www.skylit.ai/docs/api-reference/heatmap/live-per-strike-heatmap-one-or-more-symbols): Jump to **GET /v1/heatmap** and try it live in the playground. --- Source: https://www.skylit.ai/docs/api-reference/agents # Build with a coding agent > Point Claude Code, Cursor, Codex or any coding agent at one file and it can build against the Skylit API and MCP server. Skylit publishes a single, agent-ready guide: every endpoint, parameter, limit and error rule in one Markdown file, generated from the same OpenAPI specs as this reference. Give it to your coding agent and ask for what you want. | | | | --- | --- | | **Agent guide** | `https://www.skylit.ai/.well-known/agent-skills/skylit-api/skill.md` | | **Skills index** | `https://www.skylit.ai/.well-known/agent-skills/index.json` | | **Docs index** | `https://www.skylit.ai/docs/llms.txt` (append `.md` to any page URL for Markdown) | | **OpenAPI** | [`openapi.yaml`](https://www.skylit.ai/docs/openapi.yaml) · [`flowseeker-openapi.yaml`](https://www.skylit.ai/docs/flowseeker-openapi.yaml) · [`atlas-openapi.yaml`](https://www.skylit.ai/docs/atlas-openapi.yaml) | ## Install it as a skill Agents that support skills can install the guide straight from the docs site: ```bash npx skills add https://www.skylit.ai ``` ## Or paste this prompt Works with any agent that can read a URL. Set `SKYLIT_API_KEY` in your environment first (create a key on the [Developer page](https://app.skylit.ai/developer)). ```text Read https://www.skylit.ai/.well-known/agent-skills/skylit-api/skill.md and follow it exactly. Use my key from the SKYLIT_API_KEY environment variable with the header "Authorization: Bearer ". Then build: . ``` ## Or connect the MCP server If your agent should query Skylit while it works rather than write code against it, connect the MCP server instead: ```bash claude mcp add --transport http skylit https://mcp.skylit.ai/mcp \ --header "Authorization: Bearer $SKYLIT_API_KEY" ``` Other clients are covered in the [MCP quickstart](https://www.skylit.ai/docs/mcp/quickstart). > **Note:** The guide covers the rules agents most often get wrong: bearer auth only, up > to 10 symbols per heatmap call, one symbol per stream, the `layout=matrix` > grid, the historical concurrency limit, and which errors to retry. > **Warning:** API access is licensed to you for your own trading and research. An agent > acting on your key is bound by the same terms: no redistribution, public > bots or model training on Skylit data. --- Source: https://www.skylit.ai/docs/mcp/overview # Skylit MCP server > Connect an AI agent to Skylit's options-flow and dealer-positioning data over the Model Context Protocol. > **Beta.** The API and MCP server are open to invited members. If you were invited, create your key on the [Developer page](https://app.skylit.ai/developer). > **Info:** This page covers the **Skylit MCP server**: live market data, API key required. To let > your AI tool read these docs instead (free, no key), use the [Docs MCP](https://www.skylit.ai/docs/mcp/docs-mcp). The **Skylit MCP server** lets an AI agent — Claude, Cursor, or any [Model Context Protocol](https://modelcontextprotocol.io) client — query Skylit's market data directly, in natural language. Ask *"were there unusual bullish sweeps on TSLA on Friday?"* and the agent calls the right tool, reads the result, and answers. It is a **single unified gateway** over both Skylit products: - **Flowseeker** (`flow_*`, plus screeners and stats) — scored options trades, sweeps, tide, momentum, moneyness, ratios, sector and market-wide flow. - **Heatseeker** (`heat_*`) — live and historical per-strike gamma/vanna heatmaps. One API key works across both. See the [full tool catalog](https://www.skylit.ai/docs/mcp/tools). ## Endpoint ``` https://mcp.skylit.ai/mcp ``` The transport is **streamable HTTP** (JSON-RPC over `POST`, responses as Server-Sent Events). Most MCP clients only need the URL plus your key — see the [quickstart](https://www.skylit.ai/docs/mcp/quickstart). > **Note:** Every tool call costs the **same credits** as the equivalent REST endpoint. The > per-tool cost is listed in the [tool catalog](https://www.skylit.ai/docs/mcp/tools), and each > result's `meta` carries your remaining credit balance. ## Authentication Supply your Skylit API key on the MCP connection as a bearer token. The same key spans every product: ```bash Authorization: Bearer ``` > **Warning:** Treat API keys like passwords. Never commit them to source control or paste them > into a shared agent prompt. Use environment variables and rotate a key if it leaks. ## Guardrails To keep agent sessions predictable, the gateway enforces a **per-session call budget** and an **in-flight concurrency limit**. If a session exceeds them, the tool returns an error explaining the limit rather than running unbounded — credits are only ever debited for calls that actually reach the data API. - [Quickstart](https://www.skylit.ai/docs/mcp/quickstart): Connect Claude Desktop or Cursor in a couple of minutes. - [Tool catalog](https://www.skylit.ai/docs/mcp/tools): All 42 tools, grouped, with credit costs. - [Example prompts](https://www.skylit.ai/docs/mcp/examples): What to ask, and which tools answer it. - [REST API Reference](https://www.skylit.ai/docs/api-reference/introduction): Prefer plain HTTP? Use the same data over REST. --- Source: https://www.skylit.ai/docs/mcp/quickstart # Quickstart > Connect Claude Desktop, Cursor, or any MCP client to the Skylit MCP server. > **Beta.** The API and MCP server are open to invited members. If you were invited, create your key on the [Developer page](https://app.skylit.ai/developer). You need two things: the endpoint and your API key. | | | | --- | --- | | **Endpoint** | `https://mcp.skylit.ai/mcp` | | **Auth** | `Authorization: Bearer ` | Get a key from your [account console](https://app.skylit.ai), then pick your client below. ## Cursor Add the server to `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` in a project: ```json { "mcpServers": { "skylit": { "url": "https://mcp.skylit.ai/mcp", "headers": { "Authorization": "Bearer YOUR_API_KEY" } } } } ``` Reload Cursor; you should see the **skylit** server connect with its tools listed. ## Claude Desktop Claude Desktop connects to remote MCP servers in one of two ways. ### Config file (mcp-remote) Bridge to the remote endpoint with [`mcp-remote`](https://www.npmjs.com/package/mcp-remote) in `claude_desktop_config.json`. This is the recommended way to connect today: ```json { "mcpServers": { "skylit": { "command": "npx", "args": [ "-y", "mcp-remote", "https://mcp.skylit.ai/mcp", "--header", "Authorization: Bearer YOUR_API_KEY" ] } } } ``` Restart Claude Desktop after saving. ### Custom Connector (coming soon) **Settings → Connectors → Add custom connector** needs sign-in with Skylit (OAuth), which isn't live yet — pasting a bearer key here won't work. Use the config file above until it ships. The same applies to claude.ai's and ChatGPT's own connector UIs. ## Try it Once connected, ask a question that maps to a tool: > Were there any unusual bullish sweeps on TSLA today? The agent will typically call `flow_search` to confirm the ticker, then `sweeps` (or `unusual_volume`) and summarize. Browse [example prompts](https://www.skylit.ai/docs/mcp/examples) for more. ## Raw HTTP (for developers) The server speaks standard MCP over streamable HTTP, so you can drive it directly. Initialize a session, list tools, then call one: ```bash BASE=https://mcp.skylit.ai/mcp KEY="Bearer YOUR_API_KEY" # 1. initialize — returns an Mcp-Session-Id header (responses are SSE) curl -sS "$BASE" \ -H "Authorization: $KEY" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize", "params":{"protocolVersion":"2025-06-18", "capabilities":{}, "clientInfo":{"name":"curl","version":"0"}}}' # 2. complete the handshake — REQUIRED before any other call. # Reuse the Mcp-Session-Id from step 1. Returns 202 with an empty body. curl -sS "$BASE" \ -H "Authorization: $KEY" -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "Mcp-Session-Id: " \ -d '{"jsonrpc":"2.0","method":"notifications/initialized"}' # 3. list tools curl -sS "$BASE" \ -H "Authorization: $KEY" -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "Mcp-Session-Id: " \ -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' # 4. call a tool curl -sS "$BASE" \ -H "Authorization: $KEY" -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "Mcp-Session-Id: " \ -d '{"jsonrpc":"2.0","id":3,"method":"tools/call", "params":{"name":"flow_search","arguments":{"q":"TSLA"}}}' ``` > **Note:** Responses stream as `text/event-stream`, so send an `Accept` header that includes > `text/event-stream`. The `notifications/initialized` call in step 2 is required — > skip it and `tools/list` comes back empty. Send `DELETE` with the `Mcp-Session-Id` > header to end a session. (Most MCP clients perform this handshake for you; it only > matters when driving the server by hand.) > **Warning:** A `401` means the key is missing or invalid; a `403` means the key is recognized > but its plan doesn't grant API access. Check the key and that your account has > API access enabled. --- Source: https://www.skylit.ai/docs/mcp/tools # Tool Catalog > Every Skylit MCP tool, grouped by purpose, with its credit cost. > **Beta.** The API and MCP server are open to invited members. If you were invited, create your key on the [Developer page](https://app.skylit.ai/developer). The server exposes **42 tools**. Each call costs the same credits as the equivalent REST endpoint; the cost is shown per tool below and your remaining balance is returned in each result's `meta`. Every tool wraps a Skylit REST endpoint **1:1** — same auth, same credit cost, same JSON. The **Endpoint** column gives the underlying path; for the full request parameters and response schema of any endpoint, see the [API Reference](https://www.skylit.ai/docs/api-reference/introduction). For example, `flow_feed` is the [`GET /v1/flow/{ticker}`](/docs/api-reference/flow/raw-flow-feed-for-a-ticker-flow-score-flowbonus-per-trade) operation. The `heat_*` tools map to the Heatseeker heatmap endpoints (`api.skylit.ai`); everything else maps to Flowseeker (`flow-api.skylit.ai`). > **Info:** Tools that take a single option contract expect an **OPRA symbol** in URL-safe > form: `{ticker}__{YYMMDD}{C|P}{strike×1000, 8 digits}` — e.g. > `AAPL__260117C00250000`. Discover tickers with `flow_search` and expirations with > `expirations` first. ## Discovery Find valid symbols and the active universe before calling analytics tools. | Tool | Returns | Endpoint | Credits | | --- | --- | --- | --: | | `flow_search` | Search underlyings by ticker fragment | `GET /v1/underlying/search` | 1 | | `list_active_underlyings` | Every underlying that traded options on a date, ranked by premium | `GET /v1/underlying` | 1 | | `expirations` | Available expiration dates for an underlying, with contract counts | `GET /v1/underlying/{ticker}/expirations` | 1 | ## Scores & trades Scored options flow for a ticker or a single trade. | Tool | Returns | Endpoint | Credits | | --- | --- | --- | --: | | `flow_feed` | Recent scored trades (Flow Score, FlowBonus) + VWF/SDF/FIR aggregates | `GET /v1/flow/{ticker}` | 1 | | `trade_score` | Full scoring + context for one trade id (from a `flow_feed` row) | `GET /v1/score/{trade_id}` | 1 | | `aggregate_score` | Composite + VWF/SDF/FIR across one or more trailing timeframes | `GET /v1/aggregate/{ticker}` | 3 | | `flow_aggregate` | Server-side rollup over an arbitrary `[start_time, end_time]` window | `GET /v1/flow/{ticker}/aggregate` | 3 | ## Sweeps & momentum | Tool | Returns | Endpoint | Credits | | --- | --- | --- | --: | | `sweeps` | Aggregated multi-exchange sweeps with venues, premium, moneyness, score | `GET /v1/sweeps/{ticker}` | 3 | | `flow_momentum` | Live 5m/30m/1h flow vs trailing baseline, with z-scores + trend label | `GET /v1/flow/{ticker}/momentum` | 3 | | `flow_baseline` | Trailing per-time-of-day baseline `flow_momentum` compares against | `GET /v1/flow/{ticker}/baseline` | 3 | ## Strike & tide concentration | Tool | Returns | Endpoint | Credits | | --- | --- | --- | --: | | `flow_strikes` | Top-N strikes by net/total premium with bull/bear split + OI context | `GET /v1/flow/{ticker}/strikes` | 3 | | `flow_tide` | Bucketed bullish vs bearish premium with cumulative net premium | `GET /v1/flow/{ticker}/tide` | 3 | | `by_strike` | Strike-level distribution of a day's flow, optionally by DTE band | `GET /v1/underlying/{ticker}/by-strike` | 3 | ## Screeners Single-day and weekly top lists, plus unusual-activity scanners. | Tool | Returns | Endpoint | Credits | | --- | --- | --- | --: | | `top_underlyings_daily` | Top underlyings by single-day flow (call/put split, net premium, ratio) | `GET /v1/underlying/top/daily` | 1 | | `top_underlyings_weekly` | Same, over the trailing week | `GET /v1/underlying/top/weekly` | 1 | | `top_contracts_daily` | Single-day top-contract screener (premium / volume / OI / sweeps) | `GET /v1/contract/top/daily` | 1 | | `top_contracts_weekly` | Same, over the trailing week | `GET /v1/contract/top/weekly` | 1 | | `unusual_volume` | Contracts with anomalous volume vs an `avg_period` baseline (RVOL) | `GET /v1/contract/unusual-volume` | 3 | | `unusual_oi` | Contracts with significant open-interest changes (opening vs closing) | `GET /v1/contract/unusual-oi` | 3 | ## Bull/bear & pressure ratios | Tool | Returns | Endpoint | Credits | | --- | --- | --- | --: | | `chain_bull_bear` | Chain-level bull/bear/neutral % with call- and put-only breakdowns | `GET /v1/chain-bull-bear/{ticker}` | 3 | | `contract_bull_bear` | Bull/bear/neutral % for a single OPRA contract | `GET /v1/contract-bull-bear/{symbol}` | 1 | | `chain_ratio` | Chain-level ask/bid/mid + aggression ratios with a bias interpretation | `GET /v1/chain-ratio/{ticker}` | 1 | | `contract_ratio` | Same bid/ask/mid pressure for a single OPRA contract | `GET /v1/contract-ratio/{symbol}` | 1 | ## Stats, Vol/OI & moneyness | Tool | Returns | Endpoint | Credits | | --- | --- | --- | --: | | `underlying_stats` | Daily aggregate stats for an underlying (premium, volume, net, OI) | `GET /v1/underlying/{ticker}/stats` | 1 | | `contract_stats` | Daily aggregate stats for a contract (volume, OI, premium, IV) | `GET /v1/contract/{symbol}/stats` | 1 | | `vol_oi` | Vol/OI accumulation analysis; distinguishes new positioning from closing | `GET /v1/vol-oi/{ticker}` | 1 | | `moneyness` | Premium/sentiment split across deep_itm…deep_otm + detected patterns | `GET /v1/moneyness/{ticker}` | 1 | ## Chains, charts & RVOL | Tool | Returns | Endpoint | Credits | | --- | --- | --- | --: | | `option_chain` | Full chain at an expiration (per-strike call/put volume, OI, premium) | `GET /v1/underlying/{ticker}/chain` | 3 | | `underlying_chart` | Intraday OHLC-style bars for an underlying | `GET /v1/underlying/{ticker}/chart` | 3 | | `contract_chart` | Intraday OHLC-style bars for a single contract | `GET /v1/contract/{symbol}/chart` | 3 | | `underlying_rvol` | Relative-volume bars for an underlying (`format=summary` for stats only) | `GET /v1/underlying/{ticker}/rvol` | 1 | | `contract_rvol` | Relative-volume bars for a single contract | `GET /v1/contract/{symbol}/rvol` | 1 | ## Market-wide & sector | Tool | Returns | Endpoint | Credits | | --- | --- | --- | --: | | `market_overview` | Market-wide flow for the day + top tickers by premium | `GET /v1/market/overview` | 3 | | `market_tide` | Bucketed net call/put premium time series with an SPY overlay | `GET /v1/market/tide` | 3 | | `market_breadth` | SPY/QQQ/IWM sentiment, advance/decline, per-sector rotation | `GET /v1/flow/market-breadth` | 3 | | `sector_flow` | Sector/industry flow aggregation with top-contributor tickers | `GET /v1/flow/sector/{sector}` | 3 | ## Dark pool Off-exchange (TRF) prints. No side / BBO / greeks — these are raw block prints. | Tool | Returns | Endpoint | Credits | | --- | --- | --- | --: | | `dark_pool_trades` | Paginated off-exchange prints (filters: tickers / date range / notional / venue / sector); `$1M+` by default, span capped at 31 days | `GET /v1/dark-pool/trades` | 5 | | `dark_pool_top_prints` | Top-N largest prints for a ticker over a trailing window, ordered by notional | `GET /v1/dark-pool/top-prints/{ticker}` | 3 | ## Heatseeker — gamma/vanna heatmaps | Tool | Returns | Endpoint | Credits | | --- | --- | --- | --: | | `heat_heatmap` | Current per-strike gamma/vanna heatmap + live velocity (multi-symbol) | `GET /v1/heatmap` | 1 | | `heat_levels` | Key levels only: classified nodes (king, gatekeeper, pika, barney, significant), strongest first, with distance from spot | `GET /v1/gex/levels` | 1 | | `heat_historical_heatmap` | Replay the heatmap at a past instant (up to 365 days back) | `GET /v1/historical` | 5 | > **Note:** `heat_heatmap` accepts comma-separated `symbols` (e.g. `SPY,SPX,QQQ`) for a single > cross-asset call — handy for finding gamma/vanna walls across correlated names at once. ## Account Check your balance and limits before large pulls. | Tool | Returns | Endpoint | Credits | | --- | --- | --- | --: | | `account_usage` | Balance in credits and US dollars, unlimited flag, and the limits that apply | `GET /v1/account` | 0 | --- Source: https://www.skylit.ai/docs/mcp/examples # Example Prompts > Natural-language questions an agent can answer, and the tools behind them. > **Beta.** The API and MCP server are open to invited members. If you were invited, create your key on the [Developer page](https://app.skylit.ai/developer). Once the [server is connected](https://www.skylit.ai/docs/mcp/quickstart), just ask in plain English — the agent picks the tools. The examples below show the typical tool path so you know what each question costs and where the answer comes from. ## Unusual activity > Were there any unusual bullish sweeps on TSLA today? `flow_search` (confirm ticker) → `sweeps` and/or `unusual_volume`, filtered to calls. The agent summarizes premium, venues, and Flow Score. > Which tickers had the most unusual options volume this week, excluding the indices? `unusual_volume` with `exclude_tickers=SPY,QQQ,IWM` — or `top_contracts_weekly` for a premium-ranked list. ## Directional read on a name > Is the flow on NVDA bullish or bearish right now, and how strong? `aggregate_score` (Composite + VWF/SDF/FIR across timeframes), often paired with `flow_momentum` for a "vs baseline" read and `chain_bull_bear` to separate call buying from put selling. > Show me where the premium is concentrated by strike on SPY this afternoon. `flow_strikes` (or `by_strike`) over the session window. ## Positioning & accumulation > Is the OTM call activity on AMD new positioning or closing flow? `vol_oi` (accumulation score + new-position estimate) and `unusual_oi` (opening vs closing direction). > What does the AAPL chain look like for the Jan 17 expiration? `expirations` (find the date) → `option_chain` for that expiration. ## Market-wide > What's the overall market tone today — risk-on or risk-off? `market_breadth` for the one-line read, `market_overview` and `market_tide` for the supporting detail. > Which sector is seeing the strongest call flow? `market_breadth` (per-sector rotation) → `sector_flow` to drill into the leader. ## Dealer positioning (Heatseeker) > Where are the gamma walls on SPY right now? `heat_heatmap` for the current per-strike gamma exposure + live velocity. > What did the SPY gamma profile look like at the open on March 5? `heat_historical_heatmap` with `at=2026-03-05T14:30:00Z`. ## Combining both products > SPY has a gamma wall at 600 — is the flow defending it or pushing through? `heat_heatmap` (locate the wall) → `flow_strikes` / `flow_tide` around that strike to see whether premium is accumulating into or fading away from it. This pairing — positioning from Heatseeker, intent from Flowseeker — is the core reason the two products share one gateway and one key. > **Tip:** Agents work best when you give them a ticker and a timeframe. "TSLA, last hour" > beats "show me some flow." If a result looks empty, ask the agent to widen the > window or lower the `min_premium` filter.