OwlChart MCP

Live crypto and stock market data for AI assistants: prices and candles for any market, liquidity heatmaps, open interest across 13 exchanges, order book walls, funding, liquidations, spot ETF flows, insider trades, chart patterns and the day's money flows. 26 tools, remote connector with OAuth, Trial of 10 calls a day.

Hosted MCP Server

npx add-mcp 'https://owlchart.com/mcp'

Installs into Claude Code, Codex, Cursor and more

Documentation

OwlChart API

Trial, live market data for your app, bot or AI agent. The same Owl Score that powers owlchart.com, as clean JSON. Built for the builders on Virtuals and beyond.

TRIALNO API KEYCORS OPENJSON CONSOLE 2.0 DATA MARKET HOURS OWLVIEW, THE CHART OWLVIEW LITE, TRIAL SEARCH, EVERY MARKET OWLCAP, MARKET-CAP INDICES BRAND ENVELOPE OWLVIEW CHART

The $CARV developer API, no key

GET https://owlchart.com/api/carv/{price|market|history?days=365|supply|contracts|links|x}

Programs and agents (v5.734): a program that calls the API without a browser gets the daily Trial (the limits are in the 402 answer), then 402 Payment Required with three ways on: pay per request on any /api/x402/ feed (USDC on Base, x402 v2), an AiFi pass for heavy use (/api/aifi/plans, then Authorization: Bearer owlpass_..., which also opens every /api/x402/ feed without paying per call), or a PRO key. People on the website are never limited by this. The MCP connector stays open for members who sign in; anonymous connections get the daily Trial.

Insiders, live insider trades (v5.732): who inside listed companies is buying and selling, read raw from the regulators minutes after filing: SEC Form 4 and Form 144 (United States), BaFin and AMF (EU MAR Article 19), EDINET 5 percent holders (Japan). GET /api/insiders/summary?days=7 (per market: sales and buys in dollars, the sell to buy ratio, biggest sales, buys and planned sales, most sold and most bought names), GET /api/insiders?market=us&side=sell&days=7&ticker=NVDA&sort=value&limit=100 (side: trades, sell, buy, proposed, exercise, all; market: us, eu, jp, ca, au, hk, in), GET /api/insiders/markets (status of the seven markets). MCP tool get_insider_trades; paid agent feed GET /api/x402/insiders. Page: Insiders.

Bazar Agents, x402 pay per request (v5.695): AI agents can buy one OwlChart answer at a time in USDC on Base with x402 v2 (exact scheme), no account and no key: GET /api/x402/heatmap, orderbook, funding-oi, liquidations, candles, etf-flows, score, news, patterns, radar, and three packs (several feeds in one paid call): pack-coin-brief?coin, pack-trade-setup?symbol&interval, pack-money-flows. The answer is 402 with a PAYMENT-REQUIRED header; retry with PAYMENT-SIGNATURE. Listed in the Coinbase x402 Bazaar. Catalogue: /api/x402/catalog. Planned to open in December 2026. Details: Bazar Agents.

WebMCP tools for browser agents (v5.694): every OwlChart page registers ten tools with document.modelContext.registerTool() in browsers that support WebMCP (Chrome with the WebMCP flag, the ChatGPT browser, agent extensions): search_markets, market_detail, get_liquidity_heatmap, get_orderbook_walls, get_funding_and_oi, list_journal_posts, read_journal_post, open_chart, start_trial and get_agent_access. Read-only data, plus two that only open a page. The list is at GET /api/webmcp/config; the page calls POST /api/webmcp/call {tool, args, page}. Same-origin only, the agent Trial quota applies (10 a day, 30 a week per connection), switches and caps set in the backoffice. Source: /owl-webmcp.js.

CARV API (v5.691): keyless, CORS-open $CARV data in the same v:1 shape as the WLFI API: price and 24h change, the market snapshot (volume, high, low, market cap, supply, rank, ATH), daily history up to 1,000 days, supply, the token contracts on five chains and Solana, every official CARV link, and the latest @carv_official posts. Cached 30 s with a stale fallback. Docs with a live try-it box on owlchart.com/carv-api.html; the hub is carv-hub.html.

The universal search box, every market in one API

GET https://owlchart.com/api/v1/search?q={text}&class={all|crypto|equity|etf|fund|forex|future|commodity|index|bond|economy|option}&limit={n}

The API behind the search box in the OwlChart bar and on owlchart.com/tickers.html. Type a ticker, a coin, a company, an ETF, a bond, a forex pair, an economy series or paste a contract address, and the answer comes from the OwlChart universe: 31,000+ instruments read from each venue's own list and rebuilt daily. q=* with a class browses that class A to Z (add offset). Every row carries a stable id class:venue:TICKER that goes straight into /api/v1/md/ohlcv for candles. Coverage counts live at /api/v1/symbols/coverage. Any token on any DEX (v5.615): type a ticker that has no exchange listing ($TART, say) and the search asks DexScreener, keeps the real pool (the most liquidity, 10,000 dollars minimum, so dust and copycats stay out), answers it as crypto_dex:chain:TICKER with the contract address, the pair, the DEX, the liquidity and the 24 h volume in a dex block, remembers it, and the id charts through /api/v1/md/ohlcv with GeckoTerminal candles from 1 minute to 1 month. The tokens found so far: /api/v1/dex/found.

GET https://owlchart.com/api/desk/list · /api/desk/{slug} · POST /api/desk/apply · POST /api/desk/{slug}/levels · POST /api/desk/{slug}/call · POST /api/desk/{slug}/join/start · POST /api/desk/{slug}/join/verify · GET /api/desk/mine · GET /api/desk/bills · GET /api/desk/{slug}/statement · POST /api/desk/{slug}/rename

Trader desks (v5.620): a trader opens a desk on owlchart.com/desk.html (name, bio, price per month, payout wallet), OwlChart approves it, and the desk lives at /desk/{slug}: the levels he publishes (drawn on the chart), his calls stamped the moment they are posted and scored against the live price, and a private room (/api/chat?room=desk:{slug}, members and the trader only). Joining is one transfer of the desk price in USD1, USDC or USDT on Ethereum to the gateway wallet, verified on chain by join/verify, and it includes OwlChart PRO for the month. The list and the public profile are open; levels, calls and the room need a session. The owner's view and the revenue split are in the backoffice. v5.630 to 632: members pay the desks gateway wallet (separate from the PRO wallet); /api/desk/{slug}/statement (and .csv) is the trader's payout statement per week or month; /api/desk/bills gives the signed-in caller his statement (trader) or every desk payment and seat (member); /api/desk/{slug}/rename {name, txhash?} changes the desk name, 3 times for the life of a desk, the first on the house and the next two for a fee paid on chain (402 carries the fee and the wallet). The handle and the slug never change.

Agents and the whole hub (v5.616): every endpoint on this page is part of the AiFi pack. A caller that is not a browser gets 10 requests a day with no pass (header X-OwlChart-Trial n/10); after that any endpoint answers 402 with the plans in USD1, USDC or USDT on Ethereum and USDC on Base, and one owlpass_ token (or a PRO key) opens all of them. The live list the pass covers is in /api/aifi/manifest (layer tools, hub).

fetch('https://owlchart.com/api/v1/search?q=nvda&class=all&limit=5')
  .then(r => r.json())
  .then(d => console.log(d.results[0].id, d.brand.logo));

// response
{
  "q": "nvda", "class": "all",
  "universe": { "instruments": 31696, "builtAt": "2026-09-16T03:00:00.000Z" },
  "results": [
    { "id": "equity:NASDAQ:NVDA", "class": "equity", "venue": "NASDAQ", "ticker": "NVDA", "name": "NVIDIA Corporation", "quote": "USD" },
    { "id": "crypto_perp:binance:NVDAUSDT", "class": "crypto_perp", "venue": "binance", "ticker": "NVDAUSDT", "base": "NVDA", "quote": "USDT" }
  ],
  "brand": { "name": "OwlChart", "product": "OwlView by OwlChart", "logo": "https://owlchart.com/images/owlchart-mark.svg",
             "watermark": "https://owlchart.com/images/owlchart-watermark.svg", "attribution": "Powered by OwlChart.com", ... }
}

EMBED https://owlchart.com/owl-tickers.js

The same box, on your own page, with the OwlChart owl and watermark painted behind the rows and the credit line under them. OwlTickers.mount(el, {onPick}) draws it inline, OwlTickers.open() opens it as a pop-up, and onPick(row) hands you the picked instrument (leave it out and the row opens on OwlView).

<script src="https://owlchart.com/owl-tickers.js"></script>
<div id="search"></div>
<script>
  OwlTickers.mount(document.getElementById('search'), {
    onPick: row => console.log(row.id, row.ticker, row.class, row.venue)
  });
  // or a pop-up from any button:  OwlTickers.open({ onPick: row => ... })
</script>

OwlCap, the crypto market-cap indices

The market-cap shelf traders know from other charting sites, computed by OwlChart from raw points, never copied from a finished chart. Class crypto_index, venue owlcap, the same two endpoints as every other instrument:

GET /api/v1/search?q=OTHERS&class=crypto
GET /api/v1/md/ohlcv?sym=crypto_index:owlcap:TOTAL&tf=1d&limit=1000
GET /api/v1/md/ohlcv?sym=crypto_index:owlcap:BTC.D&tf=1h

The aggregates (36): TOTAL, TOTAL2, TOTAL3, OTHERS, OTHERS.D, OTHERSBTC, TOTALE50, TOTALE100 (and their.D), TOTALES, TOTAL2ES, TOTAL3ES, TOTAL3ESBTC, STABLE.C, STABLE.C.D, FIATSTABLE.C, BTC.D, ETH.D, USDT.D, TOTALDEFI, DEFIETH, MEME.C, AI.C, RWA.C, SOLANA.C, ETHEREUM.C, EXCHANGES.C, LAYER1.C, DEPIN.C, POLKADOT.C, BNBCHAIN.C, POS.C, POW.C, SMARTCONTRACTS.C, MADEINUSA.C, WORLDLIBERTY.C. Per coin: the market cap (BTC) and the dominance (BTC.D) of the top 1,000 coins.

How each one is made (OwlCap 2, 28-09-2026). Every series is built from the coins' OWN daily records, all on the same UTC day close: a coin's cap is its price times its circulating supply, one point per UTC day since the coin's first listing (Bitcoin from 28 April 2013). On every day the 500 largest coins of today are ranked by their cap on that day and the universe is the 125 largest, so a coin that was big in 2021 and small now still counts in 2021. TOTAL is the sum of the universe. TOTAL2 is TOTAL minus BTC, TOTAL3 is TOTAL2 minus ETH. OTHERS is TOTAL minus the day's top 10, TOTALE50 and TOTALE100 the same with 50 and 100. STABLE.C is the stablecoin members of the day's universe (FIATSTABLE.C the fiat-backed ones), TOTALES is TOTAL minus STABLE.C, TOTAL2ES and TOTAL3ES likewise. X.D is X over TOTAL times 100, OTHERSBTC is OTHERS over the BTC cap, TOTAL3ESBTC is TOTAL3ES over the BTC cap. A category cap (MEME.C, AI.C, TOTALDEFI...) is the sum of its 40 largest tagged members, DEFIETH is TOTALDEFI over ETH times 100. Wrapped and staked tokens carry no rank and are never counted. A coin the provider ranks more than 50 places below its position by market cap (an unverified supply or no real liquidity) is left out of the pool, the same way the index traders compare against leaves it out. Today is a live point on every series from the live listing (hourly). Intraday for every series from 5m to 4h is RECORDED by OwlChart: every 5 minutes the live listing is read and the live figure of every aggregate, every category and every pool coin is appended to a store (60 days for the indices, 3 days for coins); nothing is interpolated, and before the recorder started (28-09-2026) those candles do not exist and the answer says so (424 with a sentence). 1h and up for TOTAL, TOTAL2, TOTAL3, BTC.D and ETH.D is the all-coin hourly record used for its shape and scaled to this universe's level on the last completed day; the answer prints the ratio as scale. Candles carry open = the previous close, high and low the two, no volume. Weeks start Monday 00:00 UTC.

Check the maths yourself:

GET /api/owlcap/check      today's live figure of every aggregate, the last completed day's figures, the universe size, how many coin records are in

Market hours, the world clock with a liquidity map

The engine behind market-hours.html. One state machine, /market-hours-core.js, runs on the server and in the browser, and the two are compared on every page load. Every exchange in the registry carries its own IANA time zone, its sessions in its own wall clock (lunch is a session of its own, never a closure), its holidays, its half days, a link to its own website and the date the calendar was last verified against it. UTC is the base time; nothing in the answers assumes a country. Every answer carries the OwlChart brand envelope.

GET /api/time                          { epoch }  no cache, for correcting a drifted device clock
GET /api/markets/registry              every market: tz, sessions, holidays, halfdays, source, verified, marketCapUSD
GET /api/markets/state                 state now per market (OPEN, LUNCH, PRE, POST, PREOPEN, AFTERCLOSE, WEEKEND, HOLIDAY, HALT), next transition, next holiday. 5s cache
GET /api/markets/depth?days=14         the 24h world depth curve, the thin days ahead with the region that is thin, the closure runs. 1h cache
GET /api/markets/quotes                the benchmark index of every market, last, prevClose (the reference), change on the day, feed timestamp, server side, 60s cache
GET /api/markets/health                coverage months of forward holiday data and the verified date per exchange (Algorithm H). 5 min cache
GET /api/markets/futures?root=BZ|ES    the resolved contract from the venue's listed contracts ranked by open interest (Algorithm E): contractCode, lastPrice, prevSettle, expiry, rolled. ok:false with fallback:continuous when the venue list cannot be read

Quote states (Algorithm F): every tile on the page is LIVE, SETTLE, HOLIDAY, BREAK or STALE. A frozen price keeps the last settlement and the final change of that session, computed against that instrument’s own previous settlement, never a rolling 24 hours and never another contract. STALE thresholds: 15 s crypto and FX, 60 s index, 120 s futures.

Depth: for each five minutes, the sum over exchanges of (market cap share) × factor, 1.0 in a regular session, 0.45 pre or post, 0.15 at lunch, 0 otherwise, normalised so the day’s deepest minute is 100. Thin days: a day’s mean depth against the median of the same weekday over the last 13 weeks, for the world and for Asia, Europe and the Americas; the label is the worst of the four, THIN BOOK at a 40% shortfall, REDUCED DEPTH at 20%, and thinRegion names it. Closure runs: any market shut for three or more consecutive local dates, weekend counted in, with the next session date. All three are computed from the registry alone.

Registry rows marked verified: null carry the published pattern and a source link but have not been re-read from the exchange’s own site this year; the page says so on the card. Re-verification is due every December.

The Console 2.0 data terminal, one endpoint per panel

Every panel of the OwlChart Console reads one endpoint under /api/console/. Every answer is raw venue data or arithmetic on it, with the formula in a formula block, the raw upstream URLs in endpoints, the moment it was computed in asOf, and the sources it depends on in sources, each with its age in seconds and a green, amber or red status. A number is never answered without its age. No scores, no verdicts.

GET /api/console/flow?sym=BTC&tf=15m&limit=96      spot vs perp taker flow per candle, spike events
GET /api/console/positions?sym=BTC                 open interest per venue and summed, funding, basis, long/short, the position label
GET /api/console/book?sym=BTC                      depth within 0.5, 1, 2, 5 percent, imbalance, walls across venues, the ladder
GET /api/console/wire?sym=BTC&x=account1,account2  news and X with the price at the headline, moved %, reaction 1h, the sigma flag
GET /api/console/etf?alt=WLFI                      daily ETF flows (IBIT and ETHA first) and the four tripwire checks
GET /api/console/exp?cur=BTC                       options by expiry: notional, put/call, max pain, top strikes, countdown
GET /api/console/cal                               events in UTC with blackout bands (RED: minus 60, plus 30 minutes)
GET /api/console/rsi?sym=BTC&venue=spot            Wilder RSI 14 on 15m, 1h, 4h, 1d from 300 candles, divergence flag (divergence core)
GET /api/console/heat?sym=BTC                      the liquidity magnets with the model's own hit rate beside them
GET /api/console/base?sym=BTC                      the base rate engine, analogues and weekday distributions (PRO account token)
GET /api/console/tape?list=BTC,ETH,SOL             the ticker tape, each symbol once, macro through the server
GET /api/console/health                            one row per data source: endpoint, interval, last success UTC, age, status
GET /api/console/help                              the command list

The maths, as shipped. takerNet = 2 x takerBuyQuoteVolume - quoteVolume. perpToSpot = perp quote volume / spot quote volume. volMultiple = quote volume / median of the previous 24 candles; a spike is volMultiple >= 5 with a 2 percent move. Position label: price up and OI up is new longs, price up and OI down is short covering, price down and OI up is new shorts, price down and OI down is long liquidation, under 0.5 percent either way is flat. basisPct = mark / index - 1, funding annualised = rate x 3 x 365. A wall is a level worth 3 times the median level within 2 percent of the mid. priceAtHeadline is the close of the 1 minute candle containing the publisher's timestamp; an item moved the market when its one hour reaction is at least twice the one hour standard deviation of the last 96 hours. Max pain is the strike where the total payout to option holders is smallest. RSI is Wilder's, 14, on at least 300 closes. Health: green inside the interval, amber up to twice, red beyond, and a red source blanks every number that depends on it.

Candles and books: Binance spot and USDT perp, Bybit and OKX for open interest, the OwlChart depth service for the 22 venue walls, Deribit for options, the Farside table read server side once an hour for the ETF flows, Upbit for KRW volume, the official central bank calendars for the dates.

Console 2.0 additions (19 Sep 2026): wire?kind=stocks returns the stock and macro wire (general and forex news, no X posts, BTC price at the headline); every tape row for a stock or macro market carries q, the ticker the universal search resolves it to; an answer for a coin the venue does not list carries noMarket: true with the reason, and a 4xx from a venue never marks the source red in health.

OwlView 1.5 (the chart on this page and on every chart of the site): the Fibonacci and Gann family (trend-based extension, channel, time zone, speed resistance fan, trend-based time, circles, spiral, speed resistance arcs, wedge, pitchfan, Gann box, Gann square, Gann square fixed, Gann fan), the forecasting set (position forecast, bars pattern, ghost feed, sector), the sticker picker with the whole emoji set (/owlview/emoji-set.js) and a search box, text with a size you drag, a magnet that shows its snap point, the liquidity magnets drawing fed by /api/console/heat, and the Owl Chat drawer on /api/chat. Licensees get all of it through the same OwlView.create call.

The brand envelope, on every answer

GET https://owlchart.com/api/v1/brand

Every answer from every endpoint on this page carries a brand block, and every answer, arrays included, carries the headers X-OwlChart-Logo, X-OwlChart-Watermark and X-OwlChart-Attribution. The block holds the owl mark, the watermark image, the colours, the exact credit line and the two embed scripts (the search box and the chart). This endpoint returns the kit on its own with the rules for using it.

{
  "brand": {
    "name": "OwlChart", "product": "OwlView by OwlChart", "url": "https://owlchart.com",
    "logo": "https://owlchart.com/images/owlchart-mark.svg",
    "watermark": "https://owlchart.com/images/owlchart-watermark.svg",
    "watermark_rule": "paint the watermark centred behind the content at 8 to 10 percent opacity, never over the words, never removed",
    "colors": { "bg": "#07090c", "ink": "#e9f1f7", "up": "#2ee58a", "down": "#ff5a6a", "blue": "#5ab0ff", "orange": "#ff7a1a" },
    "attribution": "Powered by OwlChart.com",
    "attribution_html": "<a href=\"https://owlchart.com\">Powered by OwlChart</a>",
    "embed": { "search": "https://owlchart.com/owl-tickers.js", "chart": "https://owlchart.com/owlview/owlview.js" }
  },
  "rules": [ "show the credit line with the link wherever OwlChart data is shown", "the embeds paint the watermark behind their content; leave it in place", ... ]
}

Owl Score, one asset

GET https://owlchart.com/api/v1/score/{symbol}

Live 0 to 100 conviction for a coin. Use a symbol like BTC, ETH, SOL, WLFI (USDT is assumed). Cached 60s.

fetch('https://owlchart.com/api/v1/score/BTC')
  .then(r => r.json())
  .then(d => console.log(d.score, d.verdict));

// response
{
  "symbol": "BTCUSDT",
  "score": 62,
  "verdict": "LEANS LONG",
  "components": { "market_regime": 58, "entry_signal": 71 },
  "weighting":  { "market_regime": 0.45, "entry_signal": 0.55 },
  "price_usd": 63886.0,
  "rsi_14": 44,
  "updated": "2026-07-18T22:10:00.000Z",
  "brand": {
    "name": "OwlChart",
    "url": "https://owlchart.com",
    "attribution": "Powered by OwlChart.com",
    "disclaimer": "Analytics only, not financial advice."
  }
}

Owl Radar, ranked

GET https://owlchart.com/api/v1/radar

The top assets ranked by live Owl Score, highest first. Cached 60s.

fetch('https://owlchart.com/api/v1/radar')
  .then(r => r.json())
  .then(d => d.radar.forEach(a => console.log(a.symbol, a.score)));

OwlView, the chart engine and its data gateway

OwlView is OwlChart's own charting library, written from scratch, no third-party chart engine anywhere. GET /api/tokenization/summary is the mass tokenization picture read raw: totalSupply of the largest stablecoins, tokenized treasury funds and gold tokens on Ethereum, Tron and Solana, every xStock mint priced at the share's last print, and the world totals each class is measured against; /api/tokenization/history gives 52 weekly readings from the Ethereum archive. GET /api/etf/ibit-chain gives BlackRock IBIT settlement read raw from the Bitcoin chain: every transfer from the Coinbase Prime hot wallet into new cold-storage addresses in 300 BTC lots, totals per day, and each day matched to the IBIT flow reported the trading day before (the coins move T+1). GET /api/etf/ledger?asset=btc is the full flow ledger with the unreported day kept apart as pending. AiFi, the gateway for agents (v5.611, plans v5.612): GET /api/aifi/manifest is the machine manifest: the five layers (identity, money, pay per use, tools, guardrails) with their live or test status, the feeds, the 24 connector tools and the WLFI addresses. GET /api/aifi/live gives the live tiles (USD1 supply read contract by contract, the WLFI and Bitcoin consensus, connector usage, passes, the election meter). GET /api/aifi/data/{feed} answers an OwlChart calculation (heatmap_btc, heatmap_wlfi, consensus_btc, consensus_wlfi, orderbook_btc, orderbook_wlfi, oi_wlfi, etf_flows, tokenization, election, election_board, tbo_scanner, tbo_record, paper_desk) to a PRO Bearer owl_ key or to a pass; without either it answers HTTP 402 with the payment requirements in the x402 shape (exact scheme, eip155:1, asset USD1, amount, payTo). POST /api/aifi/pass {"txhash"} (or the header X-PAYMENT: 0x...) reads the USD1 Transfer log to the gateway wallet on the chain itself and issues a pass, once per transaction; GET /api/aifi/pass with the Bearer pass gives its status (plan, hours left, calls left). v5.612 plans: GET /api/aifi/plans (prices, payTo and the four accepted assets: USD1, USDC, USDT on Ethereum, USDC on Base) lists the three passes and the wallet: day pass 1 USD1 (24 hours, 2,000 calls; 2 USD1 after the first 1,000 passes), Builder 49 USD1 (30 days, 100,000 calls, commercial use) and Scale 199 USD1 (30 days, 1,000,000 calls, commercial use, priority); the plan is picked by the amount received, and the same owlpass_ token opens the MCP connector at /mcp as a Bearer, so an agent on the Trial cap buys its way on without an account. GET /api/aifi/health is the layer status and the pass counters. Prices for people and agents: pricing.html. Payment verification (v5.613b): every activation is an on-chain check of the Transfer log to the gateway wallet, once per transaction, amount against the plan: POST /api/pay/usd1/verify {txhash, payWith, plan, period} for the wallet flow, POST /api/pay/usd1/claim {reference, txhash?, asset, plan, period} for a typed hash (verified at once) or a transfer with no hash (a claim the server scans for every 2 minutes for 48 hours with eth_getLogs), GET /api/pay/usd1/claim for the member's claim status. Plans (v5.613): GET /api/config now carries plans (people, agents, company, trial) as set in the backoffice PLANS box; POST /api/pay/usd1/start and /verify take plan (member, trader) and period (year) and charge that plan's price; GET /api/aifi/plans (prices, payTo and the four accepted assets: USD1, USDC, USDT on Ethereum, USDC on Base) reads the agent passes from the same box. Agent discovery files (v5.612h): GET /.well-known/agent-card.json (the agent card: skills, security schemes, pricing, the MCP and x402 addresses; /.well-known/agent.json is the same file), GET /.well-known/x402.json (every pay per use resource with the plans and the asset), GET /openapi.json (OpenAPI 3.1 of the public and AiFi endpoints), GET /llms.txt (the site for language models, with the how to pay section), and the MCP registry proof at /.well-known/mcp-registry-auth. Agent readiness (v5.742): every page answers with a Link header pointing to llms.txt, the API catalogue, the OpenAPI, the agent card, the MCP server card, the x402 list and auth.md; GET /.well-known/api-catalog is the RFC 9727 linkset of the pay per request API, the MCP server and the site API; GET /auth.md tells an agent the four ways in (MCP Trial over OAuth, x402 pay per request, AiFi pass, PRO key); GET /.well-known/skills/index.json lists the OwlChart skill with its SKILL.md; GET / with Accept: text/markdown answers llms.txt. robots.txt carries Content-Signal: search=yes, ai-input=yes, ai-train=no. Agent registry (v5.740, admin only): GET /api/agent-registry is module 2 of the directory robot: every AI agent, MCP, x402 and AI tool registration country by country, the discovery file checks, the x402dash and 402 Index jobs and the listing verifier; ?verify=1, ?x402dash=1, ?add=1, ?set=name&status=. The pay per use layer is in test; OwlChart never holds funds or keys. Page: aifi.html. Election meter and bull case board (v5.610): GET /api/election/meter gives the two chambers as a market-implied probability read every minute from a regulated event market (CFTC overseen): mid of bid and ask per side, normalised so the two sides add to 100 (pA, pB, full precision, and pA_display to one decimal), thin on a wide gap or a quiet day, the change over 1 hour, 24 hours and 7 days in points, seats today counted in code from the Senate and House member lists, the both-chambers bound (both.bothA, both.bothB, min and max, since the combined outcome can only be bounded), the fallback and disagreement flags, alerts and a sparkline. GET /api/election/history?chamber=house|senate&from=&to=&step=minute|hour|day is the stored history since 01-09-2026. GET /api/election/pro is the bull case board: eleven factors each with its live value, line, state (on, off, unknown), formula and source, on of of, plus the season panel with its counts. GET /api/election/scenarios gives the three bounded outcomes, Bitcoin after the four comparable votes (count 4, context only) and the countdown strip in UTC. GET /api/election/stream is server-sent events, one meter event on every changed reading. GET /api/election/health is every source with its green, amber or red state and the time of its last good read. No word in these answers predicts a winner; they report a price and attribute it to the source by kind. Clarity, the crypto rules tracker (v5.536): GET /api/clarity/feed (and ?reg=sec|cftc|usbank|eu|uk|row) is the crypto rule book read live from the regulators (SEC press, statements, speeches, enforcement, EDGAR filings, the Federal Register and its public inspection desk; CFTC; OCC, Fed, FDIC, Treasury, FinCEN, IRS and presidential documents; ESMA and EBA; FCA, HM Treasury, Bank of England; FINMA and the Canadian CSA): every item with the regulator's own title, summary and link, publishedAt (the source's own time, ms UTC, null when it gives a date only) and seenAt, the sign (green, red, grey) with signReason, the tier (1 market moving, 2 watch, 3 housekeeping), who acted, the coins and companies named, the owner's override when there is one (checked), and the price reaction. GET /api/clarity/reactions?reg=&tier=&from=&to= is the reaction of BTC, ETH, TOTALE50 and the coins named to every item: the move from the close of the minute before publication to +15m, +1h, +4h, +24h, +72h, each divided by the standard deviation of that window over the 30 days before (z), MOVED at |z| of 2 or more, NO REACTION under 1; date-only items use daily candles (r1d, r3d); with the groups table (regulator, tier, actor, sign, 10 cases or more). GET /api/clarity/calendar (JSON) and /api/clarity/calendar.ics: comment deadlines and effective dates from the Federal Register plus the macro dates. GET /api/clarity/stream: server-sent events, item for every new item and tier1 for the market movers. GET /api/clarity/health: every source with green, amber (no items in 30 days) or red (failed, or no machine feed exists), its last read and its items in 30 days. ICE futures from the exchange (v5.540). 40 ICE Futures Europe, ICE Futures U.S., ICE Endex and ICE Futures Abu Dhabi contracts that no public feed carries (Low Sulphur Gasoil, Brent, ICE WTI, Dated Brent, Murban, jet, naphtha, fuel oil, propane, TTF, NBP, JKM, EUA carbon, API2, API4 and Newcastle coal, Dutch and Belgian power, cocoa, London cocoa, coffee C, robusta, sugar 11, white sugar, cotton, orange juice, canola, CoinDesk bitcoin and ether) read from ICE's own product guide, front month, in the universal search under Commodities (/api/v1/search?q=gasoil). Every row carries codes: the TradingView symbol (ICEEUR:G1!), the Bloomberg ticker (QS1 Comdty) and the Refinitiv RIC (LGOc1), all searchable, and the CME group rows carry theirs too (CL1 Comdty, CLc1). Chart through the gateway, /api/v1/md/ohlcv?sym=commodity:ICEEUR:G&tf=1d: daily settlements (close only, two years, today built from the prints) and intraday from today's prints; the answer names the contract (Oct26) and the unit. GET /api/ice/probe: whether ICE lets this server through. UK pump prices (v5.542): economy:DESNZ:UKDIESEL and UKPETROL, pence per litre with duty and VAT, weekly since 2003, read from DESNZ's weekly road fuel prices on gov.uk (search "UK diesel", "pump price"). Patterns. One engine, /owlview/pattern-core.js (45 candlestick rules and 16 chart patterns, the same file on the server and in the browser). GET /api/patterns/live?tf=&dir=bull|bear&pattern=&min=: every pattern confirmed at the last candle close across the 100 largest coins by OwlCap on 15m, 1h, 4h and 1d, best score first, with the five score parts (measured win rate, location, volume, bigger timeframe, room). GET /api/patterns/scan?sym=BTC|class:venue:TICKER&tf=: one symbol, confirmed and forming hits in the last 80 candles with score, statistics and the lines to draw (neckline, target, invalidation) plus the last 120 candles. GET /api/patterns/stats?sym=&tf=&pattern=: the measured outcome of every pattern on the full history of that coin and timeframe: cases, win rate after 3, 6, 12 and 24 candles, average move, the Wilson 90% lower bound, target-first and invalidation-first counts, anywhere, at the low or high of the last 20 candles, on heavy volume, and both. Under 30 cases the page shows no number. GET /api/patterns/stream: server-sent events, hit for every confirmed hit at a candle close and big for score 70 or more. The trainer: GET /api/patterns/trainer/round?daily=1 (a hidden past hit with 60 candles before it; the daily challenge is the same 10 rounds for every member, open play is PRO), POST /api/patterns/trainer/answer {token, answer: UP|DOWN|SKIP} (points and the reveal), GET /api/patterns/trainer/board (today and all time) and /api/patterns/trainer/me. Members: GET/POST /api/patterns/alerts with the bearer token. Every answer carries the brand envelope and a rate limit; a pattern is a probability, never advice. GET /api/etf/verdict?asset=btc|eth answers the question are the institutions selling: the verdict (SELLING when the last reported day and the last 7 trading days are both net outflows, BUYING when both are net inflows, MIXED otherwise) with the arithmetic behind it, every fund and every issuer with its last day, 7 and 30 day sums and its run of selling or buying days, plus BlackRock's own holdings file (exact coins held and shares outstanding as of a date, every version kept, so the change between two files is what BlackRock created or redeemed) and the on-chain IBIT settlement of today. Directory robot (v5.600, admin only): GET /api/directories with ?status=1, ?report=1, ?run=1, ?stop=1, ?supervise=1 (today, all time, country by country with the categories chosen, proof, alarms), ?list=1 (every site on the list with status and reason), ?verify=1, ?reset=1, ?add=domain1,domain2&lang=xx (owner-added sites, tried first within 10 minutes), ?probe=domain or ?probe=domain&go=1 (trial: posts for real on one site, logs nothing, returns every step), ?harvest=1 (the feed: footprint searches in 12 languages and sister sites, each hit probed, clean forms admitted) or ?reclassify=1 drives the server-side robot that lists owlchart.com in web directories country by country, each in its own language; it never pays, never opens an account, never answers a robot check and logs every result with its reason. Fed score (v5.599c): GET /api/fed/score gives the hike, hold and cut probabilities for the next two FOMC meetings, built the way CME FedWatch builds them: 100 minus the CBOT 30 Day Fed Funds future for the first meeting-free month after a meeting is the rate the market expects after it, and the gap to the rate before it, in quarter points, is the probability of a quarter-point move. Each meeting carries the contract used, its price, the expected rate, the score now, a week ago and a month ago (from the same contract candles) and the days to the decision; the answer carries the effective funds rate from FRED, the Kalshi prices for the same meeting (kalshi: hike, hold, cut, bigger moves, from the public KXFEDDECISION markets) and the method in words. Shown live on owlchart.com/fedmeeting.html. GET /api/usd1/supply gives USD1 supply per chain read from each chain's RPC (totalSupply), the Chainlink proof-of-reserve figure, the gap and hourly history; GET /api/usd1/attestations lists BitGo's attestation reports and the attested per-chain table (Canton). One indexable page per symbol lives at /chart/{TICKER} (for example /chart/BTCUSDT, /chart/AAPL, /chart/GSPC), listed in /sitemap-charts.xml; GET /api/seo/charts/status reports the crawl set. Under the price every chart shows the market state line (open, pre-market, lunch break, after hours, closed, with the countdown to the next bell and the last tick time), read from GET /api/markets/state, the Market Hours engine. It runs on the endpoints below, and the same endpoints are open to your app, bot or agent. Try it live at owlchart.com/owlview.html. Read the README and the licence.

GET https://owlchart.com/api/v1/md/ohlcv?sym={class:venue:TICKER}&tf={interval}&limit={n}

Candles for any market in one shape. sym is class:venue:TICKER, for example crypto_perp:bybit:BTCUSDT, crypto_spot:binance:ETHUSDT, equity:NASDAQ:AAPL, etf:NYSEARCA:SPY, forex:FX:EURUSD=X, index:INDEX:^GSPC, commodity:COMEX:GC=F, economy:FRED:CPIAUCSL. Classes: crypto_perp, crypto_spot, equity, etf, fund, future, commodity, forex, index, bond, option, economy.

tf, every interval from one second to a year: 1s 5s 10s 15s 30s, 1m 2m 3m 5m 10m 15m 30m 45m, 1h 2h 3h 4h 6h 8h 12h, 1d 1w, 1M 3M 6M 12M. Seconds are served for crypto (Binance spot one-second candles); a market that has no candles for an interval answers 424 with a plain sentence. limit 50 to 1000. Cached 1.5 s for seconds, 8 s for minutes, 120 s above.

Time limits, since 08-10-2026: every exchange behind this route gets 2.5 seconds, then the next one in the list is asked, and the whole read gets 12 seconds. When a read fails or runs out of time and the gateway holds earlier candles of that market (up to six hours old), it answers them with stale: true and stale_ms (their age). When it holds none it answers 424 with retry: true: ask again. A market that does not exist answers 424 without retry. Put your own limit on the call too; OwlView asks three times (8, 12 and 20 seconds) and then every ten seconds.

fetch('https://owlchart.com/api/v1/md/ohlcv?sym=crypto_perp:bybit:BTCUSDT&tf=1h&limit=300')
  .then(r => r.json())
  .then(d => console.log(d.k.length, d.meta.source, d.meta.chg24h));

// response
{
  "sym": "crypto_perp:bybit:BTCUSDT", "class": "crypto_perp", "venue": "bybit", "ticker": "BTCUSDT", "tf": "1h",
  "k": [[1756800000000, 77120.5, 77310.0, 76980.2, 77211.4, 1832.6], ...],   // [time ms, open, high, low, close, volume]
  "meta": { "price": 77211.4, "chg24h": -0.35, "source": "Binance perp", "delay_ms": 0,
            "sessions": "24x7", "capabilities": ["ohlcv","volume","funding","oi","liquidations"], "tradingPeriod": null }
}

GET https://owlchart.com/api/v1/symbols/search?q={text}&class={class|all}&limit={1..60}&offset={n}

The universal market search behind the chart's search box: more than 30,000 instruments across every class, by ticker, company, coin or a plain word ("gold", "spx", "apple"). q=* browses a whole class alphabetically in pages of 60 with offset. Every row carries the id you pass to the candles endpoint. Since 07 Sep 2026 a contract address works as the query too: paste a full Solana mint or TON jetton master, or its first 8 or more characters, and the on-chain row comes back first (q accepts up to 64 characters). On-chain rows carry address and chain, for example crypto_dex:raydium:LAPTOP with the mint HLwEJQ…Bfy1c7 and chain: "solana".

fetch('https://owlchart.com/api/v1/symbols/search?q=apple&class=all&limit=5')
  .then(r => r.json())
  .then(d => d.results.forEach(r => console.log(r.id, r.display, r.sessions)));

// a row
{ "id": "equity:NASDAQ:AAPL", "class": "equity", "venue": "NASDAQ", "ticker": "AAPL", "display": "Apple Inc",
  "sessions": "exchange", "capabilities": ["ohlcv","volume","earnings","news"] }

GET https://owlchart.com/api/logo/{COIN} GET /api/tklogo/{TICKER}?cls=equity GET /api/exlogo/{VENUE} GET /api/instlogo/{domain}

The pictures the chart uses: a coin's logo, a listed company's logo by ticker, an exchange's mark, and any company's mark by web domain. Every one is an image with long caching, ready for an <img>.

GET https://owlchart.com/api/config GET / POST https://owlchart.com/api/owlview/state?sym={id}

/api/config carries the owlview block the engine reads: enabled, bybitCode, proPage, proAgent, proIndicators, proTools, message. /api/owlview/state saves and returns a member's chart (drawings, alerts, indicators, scale) per symbol; it needs the member's Bearer token, up to 300 symbols and 4 MB per account.

TBO CORE /owlview/tbo-core.js

The TBO signal engine as one file, plain arithmetic on closed candles. Since 05-09-2026 it is the only copy of the algorithm on the project: owlchart.com/tbo.html, the OwlView tbo plug-in and the server scanner all run this file, so a mark on one page is the same mark everywhere. Load it before owlview.js, or let owlview.js fetch it by itself.

Marks it produces (the type field on every signal): up buy on a breakout, lg buy on a fast line bounce, sb buy on a support bounce, sh open short (early, sub roll or reject), down sell on a breakdown, cl close long, cs close short, cov cover cluster, top overheat, bot oversold, xu and xd trend cross. Entries carry score (0 to 100), tier and drawn. The forward log /api/tbo/log accepts every one of these types and scores down, xd, sh, cl, top in the short direction.

const T = window.OwlTBO;                       // or require('./tbo-core.js') on a server
const ind = T.compute(k, { barMs: 3600e3 });    // k = [[timeMs, open, high, low, close, volume], ...]
ind.sig                                        // every mark, oldest first: { i, type, score, tier, drawn, sub }
T.markers(ind, { arrows: true, state: true, squeeze: true })   // what a chart should paint: { i, pos, shape, color, text }
T.HUMAN.sh.mean                                // the plain English for each mark

DIVERGENCE CORE /owlview/divergence-core.js

The divergence engine as one file, plain arithmetic on closed candles. Since 08-10-2026 it is the only divergence reading on the project: the OwlView tbtdiv plug-in on every chart page, the Owl Agent and the console RSI flag (/api/console/rsi) all run this file. Load it before owlview.js, or let owlview.js fetch it by itself.

The seven inputs and their defaults: rsiLen 11, divRsiLen 30, priceLen 29, high 79, low 24, div 36, clusterOn true with clusterGap 7. Price rank is where the candle high (or low) stands in the high to low range of the last priceLen candles, 0 to 100. RSI rank is where the RSI stands in its own range of the last divRsiLen candles. Bearish: price rank of the high at or above high and at least div points above the RSI rank. Bullish: price rank of the low at or below low and at least div points below the RSI rank. One mark on the first candle of a run.

Marks (the type field): bear bearish divergence, bull bullish divergence, bearc bearish cluster and bullc bullish cluster, the third mark and every later one in a chain where each came within clusterGap candles of the one before. record() measures what price did after each kind of mark, so a page states a hit rate only from the count.

const D = window.OwlDiv;                        // or require('./divergence-core.js') on a server
const ind = D.compute(k, { rsiLen: 11 }, { barMs: 864e5 });   // k = [[timeMs, open, high, low, close, volume], ...]
ind.sig                                        // every mark, oldest first: { i, t, type, side, cluster, chain, price, rsi, priceRank, rsiRank, gap }
D.markers(ind, { size: 1, words: true })       // what a chart should paint: { i, pos, shape, color, size, text }
D.record(k, ind, 10)                           // per mark type: n, hit, hitRate, avgPct after 10 candles
D.HUMAN.bearc.mean                             // the plain English for each mark

The settings window: every OwlView indicator opens one window with three tabs, Inputs, Style and Visibility. An indicator describes its window with two lists on its definition, inputs and style, each line { group, k, label, type: 'int' | 'num' | 'bool' | 'color' | 'select', min, max, toggle, color, options, info }. An indicator without the lists gets a window built from its parameters.

LIBRARY /owlview/owlview.js   /owlview/owlview-search.js   /owlview/owlview.css

The engine itself: candles, hollow candles, bars, line, area, Heikin Ashi, 23 indicators as plug-ins, each with its own settings window (Inputs, Style, Visibility), more than sixty drawing tools saved per user, alerts, replay, undo, magnet, a price scale with percent, indexed and log units, night and day, the Owl Agent, and a watermark that takes your mark. It talks to data through a feed adapter of four functions, so it runs on the OwlChart gateway or on your own feed. Licensed per company; the files are proprietary, see the licence.

<link rel="stylesheet" href="https://owlchart.com/owlview/owlview.css">
<div id="chart" style="height:640px"></div>
<script src="https://owlchart.com/owlview/owlview.js"></script>
<script src="https://owlchart.com/owlview/owlview-search.js"></script>
<script>
  const chart = OwlView.create(document.getElementById('chart'), {
    sym: 'crypto_perp:bybit:BTCUSDT', tf: '1h',
    indicators: [{ key: 'tbo' }, { key: 'rsi' }],
    brand: { name: 'YourView', by: 'Your Company', url: 'https://your.site', mark: '/your-mark.svg' },
    affiliate: null                       // or { label, code, url } for your own trade button
  });
  // chart.setSymbol(id), setTf('5m'), addIndicator('ema', { length: 50 }), setTool('trend'), getState(), applyState(st)
  // OwlView.setTheme('day'), OwlView.indicators.myema = { name, pane, params, compute(c, p) }
</script>

OwlView Lite, the trial chart for any website

SHOP https://owlchart.com/library.html

The OwlView library licence (v5.668, 11-10-2026): a company logs in, names its domain, pays in USD1, USDT, USDC or WLFI wallet to wallet, pastes the transaction hash, and downloads a bundle of the full library built for that domain (cores obfuscated, library minified, every file locked to the domain). Price from the company plan in the backoffice. v5.669 (11-10-2026): one payment (price in the Library office of the backoffice), no monthly or yearly; every download is approved by OwlChart one by one, up to 2 per licence (POST /api/licence/request from the buyer, POST /api/licence/release admin); invoices GET /api/licence/invoice/:id (printable page, ?json=1), admin invoices GET /api/licence/invoices and POST /api/licence/invoice/create|update|delete, POST /api/licence/delete, GET/POST /api/licence/settings; the bundle carries OwlView-Installation-Guide.pdf.

KYA, Know Your Agent (v5.673, 13-10-2026): no KYC on OwlChart, and identity is never a condition to buy or use a pass. The gateway keeps a record per paying wallet (passes, plan, calls, first and last seen). An agent may declare itself: POST /api/aifi/agent with its pass token as Bearer and { name, operator, card, homepage, contact, framework }; GET /api/aifi/agent returns the record the gateway keeps about it. A CARV ID (ERC-7231, opBNB contract 0xcd3c861a0c8f867f78396a69b14c4f8953fc4ee9) on the paying wallet is read on chain, free, and shown next to the agent. A wallet blocked by the OwlChart owner cannot buy a pass or call a feed (HTTP 403 with the reason).

GET /api/licence/plan

Public: price, period, the assets on offer, the live WLFI rate, the benchmark.

POST /api/licence/start

Member: { domain, asset, period } returns the order: amount, wallet, reference.

POST /api/licence/verify

Member: { id, tx }. Reads the ERC20 Transfer log on Ethereum, records the licence, builds the bundle, writes the invoice.

GET /api/licence/mine · /api/licence/download/:id

Member: the caller's licences; the zip for a paid licence (seven day grace after the end date).

GET /api/licence/check?domain=

Public: { licensed, until } for a domain, no names.

GET /api/licence/list

Admin: every order and licence with the payer address and the amount received.

EMBED https://owlchart.com/embed/owlview-lite.js

OwlView Lite in one line (v5.667, 11-10-2026): <div data-owlview="BTCUSDT" data-search="1" style="height:480px"></div> <script async src="https://owlchart.com/embed/owlview-lite.js"></script>. Attributes: data-tf, data-type, data-indicators (ema:50,bb), data-theme, data-search (the OwlChart market search above the chart). The chart paints the OwlChart mark and a credit link with ?ref= the host site. Builder and docs: owlview-lite.html.

GET /api/embed/beacon?host=&sym=&w=

Sent once per page load by the embed: the host site, the market and the widget. Answers 204. No cookie, no visitor data.

GET /api/embed/hosts

Admin: the sites using OwlView Lite, newest first, with loads and top symbols (also /api/embed/hosts.json).

TRIAL https://owlchart.com/owlview/owlview-lite.js

The light edition, the way chart vendors give a trial chart and sell the full library. Candles, hollow, bars, line, area, volume, crosshair with a legend, zoom, pan, touch and pinch, a live price scale, a time scale, SMA, EMA, VWAP and Bollinger Bands, night and day, every market and every interval through the OwlChart gateway or your own feed. Trial on any site, commercial or not, on one condition: the OwlChart credit and the watermark stay visible. Demo and the full comparison: owlchart.com/owlview-lite.html. Licence: LICENSE-LITE.txt.

<script src="https://owlchart.com/owlview/owlview-lite.js"></script>
<div id="chart" style="height:480px"></div>
<script>
  const chart = OwlViewLite.create(document.getElementById('chart'), {
    sym: 'equity:NASDAQ:AAPL', tf: '1d', type: 'candles',
    indicators: [{ key: 'ema', params: { length: 50 } }]
  });
</script>

AI connector (MCP server): OwlChart inside Claude, ChatGPT, Grok and Cursor

POST https://owlchart.com/mcp

A remote Model Context Protocol server (Streamable HTTP, JSON-RPC 2.0, JSON responses). Add the URL as a custom connector in Claude, ChatGPT, Grok, DeepSeek (DeepSeek Harness, streamable-http in cordis.yml), Cursor, VS Code or any MCP client; the assistant then calls OwlChart's live data while it answers. Methods: initialize, ping, tools/list, tools/call. 13 read-only tools: search_markets, get_price_history, get_liquidity_heatmap, get_open_interest, get_orderbook_depth, get_owl_score, get_etf_flows, get_funding_rates, get_liquidations, scan_patterns, get_market_radar, get_tokenization_overview, get_crypto_regulation. Every result carries the source, the read time (day-month-year, UTC) and the owlchart.com page it came from.

v5.559 (30-09-2026): 10 more tools, 23 in all. show_chart returns candles plus liquidity magnets and a structuredContent copy, and declares the MCP Apps view ui://owlchart/chart.html (_meta.ui.resourceUri; resources/list and resources/read serve it as text/html;profile=mcp-app). create_alert (types price_above, price_below, oi_change, magnet_hit, funding_extreme, etf_flip; optional https webhook_url, public hosts only), list_alerts, delete_alert, check_alerts: checked every minute, max 10 active per member. get_watchlist, add_to_watchlist, remove_from_watchlist: per member (PRO key user, OAuth sign-in, or the anonymous connection), never shared. get_track_record reads GET /api/sig/record (optional ?symbol=BTCUSDT). get_money_flows combines /api/tokenization/summary 24h changes, /api/etf/verdict and /api/oi/intraday. Write tools carry readOnlyHint false (delete tools destructiveHint true). New pages: track-record.html, owlchart-vs-tradingview-ai.html.

v5.691 (15-10-2026): new tool get_carv, the $CARV hub in one call: what=market, history (days=2 to 1000), supply, contracts, links or x (latest @carv_official posts). Same data as /api/carv.

v5.555 (30-09-2026): a stock or ETF ticker (AAPL, COIN) now resolves to the real listing, not a tokenised-stock perp; get_price_history returns exactly the number of candles asked; get_liquidity_heatmap adds oi_all_venues_usd (the 13-exchange total); get_liquidations returns totals, dollars per venue and the 15 biggest events; scan_patterns returns the 8 latest and 5 strongest patterns with measured win rates; get_crypto_regulation returns the bill status and dated headlines without redirect links.

Access: Trial with no key, 10 tool calls a day per visitor. PRO: send Authorization: Bearer owl_..., the personal key from the dashboard (AI Connectors box); no daily cap while PRO is active. How-to for every client: connectors.html.

curl -s https://owlchart.com/mcp -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_open_interest","arguments":{"coin":"WLFI"}}}'

GET https://owlchart.com/api/mcp/info

The public card of the connector: URL, transport, access, the tool list with descriptions, and usage since the last restart (calls by tool, client names). GET /api/mcp/key (signed in) returns the member's own owl_ key.

Spot flow, net taker buying per coin

GET /api/flow/coins?syms=BTC,ETH,WLFI (v5.562, 01-10-2026): net taker flow in dollars (taker buy minus taker sell, hourly candles) per coin over 1h, 4h, 12h, 24h, 3d and 7d, with the venue used (Binance spot, or Binance perp when the coin has no spot pair), last price and reading time. Up to 40 coins per call. Cached 60 s.

GET /api/flow/series?sym=BTC&hours=168: hourly bars [time, net, buy, sell, close], 24 to 168 hours. &interval=1d&days=90 (v5.563) returns daily bars, 7 to 180 days. Both feed inflow-outflow.html, which reads them server-side so every visitor sees the same numbers.

The Owl Journal, live news

GET /api/journal/wire (v5.569, 01-10-2026): the live news wire, newest first, merged from the console's crypto wire (news, X accounts, rule changes, patterns) and the stock and macro wire: { items:[{ desk, kind, src, headline, t, url, ticker, at_headline, now, moved_pct, reaction_1h_pct, moved_market }], calendar:[{ name, t, importance }] }, cached 60 s.

GET /api/journal/latest?n=10: the newest Owl Journal stories (title, dek, category, tickers, published, url). GET /api/journal/article/{slug}: one story with its paragraphs and the data it was written from. RSS: /journal/feed.xml. GET /api/journal/chart/{slug} (v5.595): the daily candles drawn inside a story, exactly as read when it was written, with the link to the live chart. Each story from /api/journal/article/{slug} now also carries view (The Owl's view, a reading made by rule from the chart's numbers), links (every market the story names with its chart) and charts (how many charts it has). GET /api/journal/packet/{slug} (v5.572): the exact data packet a story was written from. GET /api/journal/record: the Journal track record (consensus calls scored 72 h after publishing: hit, miss, neither). GET /api/journal/status: stories, writer log. Wire items now carry type (News, X post, Signal, Rule change), latency_s (seconds between the publisher's time and OwlChart first seeing it), delay (v5.577, the same as plain text shown on every wire line, e.g. "delay 2 min" or "delay not measured" for items already on the feed when tracking began). v5.578: the reply carries latency { window, measured, median_s, within_5min_pct, by_kind:{ news, x, rule, pattern } } for the last 24 hours, and the console wire (/api/console/wire) now reads CoinDesk, Cointelegraph, Decrypt, The Block, and (v5.579) CNBC and MarketWatch straight from their RSS feeds every 60 s (items carry via:"rss"); the same story from the news API is dropped in favour of the faster RSS copy. v5.587: POST /api/journal/withdraw (admin, { slug, text }) withdraws a story: it leaves every list, its address answers 410 with the reason and it is listed on the corrections page. v5.585 Owl News: GET /api/journal/markets?k=coin|equity|etf|index|forex|future|commodity returns every market OwlChart has a chart page for with its price and 1, 7, 30 and 365 day move, read every 6 hours from the daily candles ({ read_at, kinds:[{k,name,markets}], rows:[{ slug, name, kind, price, price_text, d1, d7, d30, d365, chart }] }); pages /journal/markets.html and Owl News; every story from /api/journal/article/{slug} now carries x_post and hashtags (exactly two) and img. v5.582: the wire also reads SEC press releases (sec.gov RSS) and the X accounts @SECGov and @SECPaulSAtkins; journal wire items carry regulator and official, and a regulator decision gets its own Regulation story that leads the front page for 6 hours and also (other sources of the same headline, merged). Pages: /journal/, /journal/news.html. AI connector tool: get_news.

v5.574 (01-10-2026) wire fields: each item also carries impact ("high"|"med"|"low"), dir ("bullish"|"bearish"|"neutral"), why (high impact only), breaking (true for at most 3 high-impact items of the last 60 minutes), repeats (how many sources reported it) and also (the other sources). The reply adds bias { bullish, bearish, neutral, classified, lean } for the last 24 hours. Classification by Claude AI from the headline text alone.

GET /api/protect/health (v5.666, 11-10-2026): the code protection status: how many engine files are served protected, built and served counts, the last error. The chart engines (TBO, TBT Divergence, patterns, the agent brain, market hours, the RSI view, OwlView) are delivered obfuscated or minified and locked to owlchart.com; OwlView Lite, the search box and owl-tickers.js stay open for embedding. Paying OwlView customers are added to the allowed hosts.

GET /journal/medium.json (v5.663, 11-10-2026): the newest 40 Owl Journal stories with their Journal link and a clean copy link. GET /journal/medium/{slug}: a clean copy of one story (title, standfirst, headings, pictures with captions, paragraphs, canonical link to the Journal story, noindex), made for importing into Medium and other blog platforms.

GET /api/journal/crosscheck (v5.574): BTC and ETH spot read at the same moment from two venues. { ok, read_at, rows:[{ coin, binance_usdt, coinbase_usd, diff_pct }] }. GET /api/journal/record: the journal's scored calls (hits, misses, waiting).

Consensus direction, one answer for every chart

GET /api/consensus?sym=BTC (v5.568, 01-10-2026): OwlChart's single direction read, shown the same on the heatmap, TBO, console and OwlView, and returned to AI apps inside get_liquidity_heatmap. { ok, brand, sym, price, verdict: "UP"|"DOWN"|"BALANCED", next, target, agreement: "agree"|"mixed"|"none", odds:{ down, up, samples, window_hours, history_months, neither_pct }, trend, rsi, pull, pullDir, above, below, headline, how }. Direction = which liquidity magnet the price is likelier to touch first, with the odds measured on the coin's own hourly Binance spot history (12 months, first touch within 72 hours) for today's exact distances; BALANCED under 55%. The TBO trend is context. Crypto coins with a Binance spot USDT pair. Cached 60 s.

Bitcoin cycle indicators

GET /api/cycle/list (v5.567, 01-10-2026): the eight indicators with their formulas, and how many daily closes the server holds.

GET /api/cycle/{metric}, metric = 200wma, pi-cycle, golden-ratio, ahr999, rainbow, profitable-days, stock-to-flow, puell. Computed by OwlChart from Bitstamp BTC/USD daily closes since August 2011 (raw, kept on the server, topped up hourly). Answer: { ok, brand, name, formula, source, days, last:{t,price}, now:{...latest readings}, events, bands, t:[...], price:[...], lines:{ name:[...] } }. Every 3rd day before the last two years, every day after. Cached 1 hour. Feeds 200 week MA, Pi Cycle, Golden Ratio, AHR999, Rainbow, Profitable days, Stock to flow, Puell Multiple.

Open interest, every exchange summed

GET https://owlchart.com/api/oi/summary?sym={BASE}

Open interest for one coin read live by OwlChart's server from 13 exchanges at once: Binance, Bybit, OKX, Bitget, Gate, KuCoin, HTX, MEXC, Kraken, Coinbase International, Hyperliquid, dYdX and Aster. One row per venue with coins, usd, the venue's own px, the exact feed url and the trading page; a venue that does not list the contract or does not answer comes back with miss:true and is left out of total. n of of venues answered, at is the read time. Cached 60 s. Added 26-09-2026 after a reader showed the old page giving one venue's figure as the market.

fetch('https://owlchart.com/api/oi/summary?sym=WLFI').then(r=>r.json())
// { ok:true, base:"WLFI", total:209235211, n:12, of:13, at:1790451813521,
//   rows:[ { k:"binance", name:"Binance", coins:2397245813, usd:140478604, px:0.0586, url:"https://fapi.binance.com/...", page:"https://www.binance.com/en/futures/WLFIUSDT" }, ... ] }

GET https://owlchart.com/api/oi/intraday?sym={BASE}

The last 24 hours minute by minute for WLFI, BTC, ETH, SOL and XRP (tracked:true): each point carries t, total, n venues and v, the dollar figure per venue. The server reads every exchange every 60 s. Other coins answer with an empty list and tracked:false; their live summary still works.

GET https://owlchart.com/api/oi/history?sym={BASE}

Daily open interest per venue in US dollars, each day at that day's own price. Exchange archives where they exist (Binance 30 days, Bybit, Gate and HTX about 200 days) merged with OwlChart's own daily record of every venue from 26-09-2026 on, never overwriting an exchange figure. Each day: d, t, v per venue, total, n. Compare only the venues present on both days when you compute a change, or a venue joining the record looks like a jump.

POST https://owlchart.com/api/presence/beat

Sent by every OwlChart page once a minute while the tab is visible, body {"page":"/oi-history.html"}, cookie only. It is how the backoffice counts people rather than page downloads (crawlers are named by user agent and counted apart). Not a data feed; documented so the traffic you see in your own tools makes sense.

The order book family, where the money is actually resting

GET https://owlchart.com/api/v1/obstats/{symbol}

The live order book read across every exchange we can reach, in one JSON object. Per exchange, per side: lowest, best, median and size-weighted average price, in dollars. Every exchange we could not count is named with the reason, the response states what share of the coin’s traded volume it covers, and the arithmetic balances: connected equals counted plus left out, checked on every reading. Cached 1s.

fetch('https://owlchart.com/api/v1/obstats/WLFI')
  .then(r => r.json())
  .then(d => console.log(
    d.mid,                        // one consensus price, median of venue mids
    d.venueStates,                // { FULL, PARTIAL, EXCLUDED }
    d.coveragePctOf24hVolume,     // how much of the real market this reading holds
    d.bandLabel,                  // the band the money was actually measured in
    d.integrity                   // polled = inStats + excluded, balanced true/false
  ));

GET https://owlchart.com/api/v1/ladder/{symbol}

The price you would actually be filled at. Every exchange’s resting orders merged into one book, then the size-weighted fill price for a $5,000, $25,000, $100,000 and $250,000 order on each side, with the distance from the current price and how many exchanges the fill crossed. A row that cannot fill says so and reports how far it got, it never invents the rest. Cached 2s.

fetch('https://owlchart.com/api/v1/ladder/WLFI')
  .then(r => r.json())
  .then(d => d.buy.forEach(row => console.log(
    '$' + row.sizeUsd, 'fills at', row.vwap,
    row.slippagePct + '% from mid,', row.venues, 'exchanges'
  )));

GET https://owlchart.com/api/v1/depth/{symbol}

How much money is resting around the price, added up across every exchange, with market maker inventory stripped out separately so you can see both totals. Carries the same coverage and band honesty fields as obstats.

GET https://owlchart.com/api/v1/obseries/{symbol}?tf=1s&limit=1800

The recorded history of the book: one reading a second for the last six hours, one a minute for thirty days. Server stamped as it happens, so it cannot be backfilled or cherry picked. tf is 1s or 1m.

OwlNet, the signed packet

OwlNet is the network under OwlChart. It publishes one packet per symbol, and the packet carries the readings it was built from, so nobody has to take a number on trust. The arithmetic lives in one file, /owl/packet-core.js, which this server runs and your browser can run too. There is no second copy of it anywhere.

GET https://owlchart.com/api/owl/packet/{symbol}

One signed packet. Priced, it carries mid, bandPct, dispersionPct, and depth, the real money resting within 0.5, 1 and 2 percent of the mid on both sides, each with how many venue books actually reached that far, because on a tight market most books stop long before 2 percent and a figure built from them would describe nothing. It also carries how many venues answered and how many counted, every exclusion with its reason, the age of the oldest reading, a fingerprint of the readings, a fingerprint of the program, and an Ed25519 signature.

When fewer than three venues pass, or the venues are more than 2 percent apart, or the oldest reading is over 45 seconds old, there is no price. The packet carries a signed refusal naming the gate that stopped it. A refusal is a normal answer, not an error, and it is signed exactly like a price.

Add ?receipt=0 for the numbers without the readings. Leave it off and the readings come with it, which is what makes the packet checkable.

GET https://owlchart.com/api/owl/key

The public half of the signing key. A signature proves the packet left this network unchanged. It does not prove the number inside is right, which is exactly why the readings travel with it.

POST https://owlchart.com/api/owl/verify

Send back a packet with its receipt and this re-runs the same arithmetic and answers field by field: the price, the depth, the refusal, the two fingerprints. A browser does this locally on the packet page without sending anything to us; this route is for everything that is not a browser.

Launch Radar, which token is the real one

GET https://owlchart.com/api/radar?q=LAPTOP

When a famous name announces a coin, twenty tokens appear with that name inside an hour. This returns every one of them with the facts needed to tell them apart: the chain, how old the market really is, whether more coins can still be printed, whether your wallet can be frozen, any Token-2022 extension that could tax or block your sell, and the exit depth, which is what a sale would actually return. An index is used only to discover which addresses claim the name. Every number in the answer is computed by OwlChart from the chain and from the pool’s own two balances, x times y equals k, with the fee taken off. Nothing is ever marked OFFICIAL for being popular: a token is marked official only when an official source has published that address, and the source is named in the answer. Cached 60s, no key. Add &deep=0 to skip the per-token chain read and answer faster.

fetch('https://owlchart.com/api/radar?q=LAPTOP')
  .then(r => r.json())
  .then(d => console.log(
    d.watch,                          // what was actually announced, and by whom
    d.watch.officialAddress,          // null until an official source publishes one
    d.tokens.map(t => t.status),      // OFFICIAL or NOT VERIFIED AS OFFICIAL
    d.tokens[0].exit,                 // what $100, $1k, $5k, $10k would really return
    d.tokens[0].chainFacts.canMintMore,   // can more be printed after you buy
    d.tokens[0].flags                 // every reason this one is questioned
  ));

GET https://owlchart.com/api/radar/watchlist

The launches OwlChart is tracking, what was announced for each, the chain and the date, and the official address once one exists.

$X Empire, our own on chain price and candles

GET https://owlchart.com/api/xchart?tf=1h&limit=500

OwlChart’s own OHLCV candles for $X Empire, built from the raw swaps in the STON.fi pools on TON after MEXC delisted it. A swap’s price is the other token’s amount divided by the $X amount, converted at that token’s dollar price for the hour the trade happened. A bar with no trade in it carries the last close at zero volume, and the answer says how many bars were carried. Nothing copied from a price aggregator.

GET https://owlchart.com/api/xprice

The live STON.fi pool price for $X Empire plus our own last recorded on chain swap, with 1h, 24h and 7d change computed from our own swap record.

GET https://owlchart.com/api/xholders

How many wallets hold $X Empire, read from the TON jetton index on chain, with the change over 24 hours and 7 days from our own hourly record, and a link to the full wallet list.

The X Empire ($X) hub feed

GET https://owlchart.com/api/xempire

Everything the X Empire hub shows, in one JSON object: live price, market value, the full supply picture (690 billion tokens, all of them circulating — scarcity 100%, with the basis for that figure stated in the response), every market it trades on merged from CoinGecko and CoinMarketCap with a direct trade link per venue, the 7-day price history, and community counts. No key, no parameters. Cached 60s.

fetch('https://owlchart.com/api/xempire')
  .then(r => r.json())
  .then(d => console.log(
    d.price,                      // live $X price in dollars
    d.supply.scarcityPct,         // 100 = nothing left to unlock or vest
    d.marketCapUsd,               // price x circulating, basis stated in d.supply.basis
    d.markets.map(m => m.venue),  // every exchange, CoinGecko + CoinMarketCap merged
    d.links                       // site, X, Telegram, chain explorer
  ));

Live market widgets for any website

https://owlchart.com/embed/owl-widget.js

Five widgets, one loader: a price ticker, a price card, a mini chart with 1D to ALL, the top coins table and Bitcoin or Ethereum ETF flows (BlackRock first). 19 languages, night and day, phones to desktops, refreshed every minute. Build and copy the code on owlchart.com/widgets.html. Symbols take short names (BTC, ETH, GOLD, OIL, GASOIL, UKDIESEL, SPX, EURUSD, AAPL) or any gateway id from the universal search.

<div class="owlchart-widget" data-type="mini" data-symbol="BTC" data-range="1M" data-lang="es" data-theme="dark"></div>
<div class="owlchart-credit"><a href="https://owlchart.com/chart/BTC">Bitcoin price chart</a> by OwlChart</div>
<script async src="https://owlchart.com/embed/owl-widget.js"></script>

data-type: ticker (data-symbols, up to 20), price (data-symbol), mini (data-symbol, data-range 1D 1W 1M 1Y ALL, data-height), markets (data-n 3 to 50), etf (data-asset btc or eth). Direct frame: /widget.html?type=price&symbol=BTC&lang=ja. Data behind them: /api/v1/md/ohlcv, /api/cg/markets, /api/etf/flows. The credit line stays visible under the widget and the owl stays inside it.

Embed the live Owl Score badge

Drop a live, self-updating Owl Score badge on your own site, dashboard or agent page. It refreshes every minute and links back to OwlChart. Trial, no key.

Change sym to any major asset, BTC ETH SOL XRP BNB DOGE ADA WLFI and more. The badge shows the live score, verdict and price, and every embed sends the owl back a visitor.

<iframe src="https://owlchart.com/widget-score.html?sym=BTC"
        width="320" height="150" style="border:0;overflow:hidden"
        title="BTC Owl Score by OwlChart" loading="lazy"></iframe>

The one rule, keep the owl

Trial forever, in exchange for a visible credit.

Wherever you show OwlChart data, display a visible Powered by OwlChart link back to https://owlchart.com (the owl mark is welcome too). That is the whole deal: you get live data on trial, the owl gets seen. Every response carries a brand block with the logo, the watermark and the exact text and link to use, and the embeds (the search box, the chart) paint the OwlChart watermark behind their content. Leave it there.

<a href="https://owlchart.com">Powered by OwlChart</a>

Notes

No API key needed. Endpoints are CORS-open so you can call them straight from a browser or an AI agent. Please cache on your side and avoid hammering (the data updates about once a minute). These endpoints are on trial and computed from public market data, so they cost nothing to run and stay trial. Higher volume, webhooks, alerts and historical data will come as a paid tier later. Analytics only, never financial advice.

See it live on the console