How Gapwatch works, in plain English: what it measures, where each number comes from, how fresh it is, and what it can't tell you. The same data is available as a free JSON API.
Robinhood Stock Tokens trade onchain in Uniswap pools against USDG. Gapwatch asks one question per token: is the pool price close to what the stock is worth right now?
Premium = (pool price − reference price) ÷ reference price, in percent. A positive premium means the token is trading above its reference; a negative one, below. Within ±1% is shown as “in line”, 1–5% as elevated, above 5% as a large gap. Every premium says which reference it used.
Gapwatch also shows 2% depth (how much money moves the pool price 2%), the US market session and the issuer's mint window, and checks whether a contract address is an official Robinhood Stock Token.
slot0(), or hookless v4 through the official StateView (opens in a new tab) contract). The main pool is the one holding the most USDG, chosen from the official Uniswap factories and reviewed by hand. 60 of 195 tokens have one today.latestRoundData(). Feeds come from Chainlink's directory (opens in a new tab) and are matched to a token only on exact documented fields. The feed already includes the token's share multiplier.Buy depth is the USDG you would pay to push the pool price up 2%. Sell depth is the USDG you would receive when selling enough tokens to push it down 2%. If either side is under $5,000, the pool is marked thin: small trades can move its price a lot, so a large premium there means less.
Paste an address on Check a token. Gapwatch compares it with Robinhood's live list (cached 10 minutes; a saved copy is used, and clearly labelled, if the live list is down), then reads the contract's own symbol(), name() and decimals(). A matching name or symbol proves nothing; only the contract address does.
Not financial advice. Gapwatch describes prices; it doesn't recommend any trade. It is read-only: no wallets, no transactions.
Free, read-only JSON for bots and AI agents. No key needed. Every response comes from the same cached snapshot as the website, so calling the API never triggers extra chain reads.
GET /api/fair-price/<symbol>: one official token (symbol is case-insensitive). Unknown symbols return 404.GET /api/board: every token with an active USDG pool, plus coverage counts.GET /api/check/<address>: the official-check verdict (official, impersonation, similar-symbol, not-official, not-token or unknown), with the matched official token, explorer links and which list was used.curl https://gapwatch.xyz/api/fair-price/NVDAExample response (shortened):
{
"symbol": "NVDA",
"name": "NVIDIA • Robinhood Token",
"tokenAddress": "0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC",
"official": true,
"chainId": 4663,
"hasPool": true,
"poolPrice": {
"usd": "217.27", "status": "LIVE", "reason": null,
"source": { "label": "Uniswap v3 NVDA/USDG 0.05% pool", "url": "…" },
"pool": { "version": "v3", "id": "0xd4EB…14a3", "feeTier": 500, "feePct": "0.05%", … },
"observedAt": "2026-10-20T06:00:00.000Z", "blockNumber": 93197907
},
"reference": {
"usd": "218.18", "kind": "chainlink", "status": "LIVE", "reason": null,
"label": "Chainlink feed, updated 3h ago", "source": { … },
"feedAddress": "0x379E…9F15", "updatedAt": "2026-10-20T03:00:00.000Z"
},
"premiumPct": {
"value": "-0.42", "status": "LIVE", "reason": null,
"description": "0.42% below reference",
"summary": "NVDA token is trading in line with its Chainlink reference (0.42% below)."
},
"depth": {
"buyUsd": "371052.77", "sellUsd": "402114.10", "method": "quoter",
"thin": false, "thinThresholdUsd": "5000", "status": "LIVE", "reason": null,
"measuredAt": "…"
},
"market": { "usSession": "after-hours", "mintWindowOpen": true, "nextMintWindowChangeAt": "…" },
"snapshot": { "blockNumber": 93197907, "generatedAt": "2026-10-20T06:00:01.000Z" },
"disclaimer": "Read-only market data. Not financial advice."
}"217.27"), never floating-point numbers.LIVE, STALE, UNAVAILABLE) and a reason (null when there's nothing to explain). A value that couldn't be read is null with status UNAVAILABLE.{ "error": { "code": "not_found", "message": "…" } }. Codes: invalid_symbol, invalid_address (400), not_found (404), rate_limited (429), upstream_unavailable (503), internal_error (500).Retry-After header. The limit is counted per server instance, so treat it as a courtesy limit, not an exact quota.GET is allowed from any origin, so browser apps can call it directly.Gapwatch is also an MCP server (Model Context Protocol, the standard way AI assistants connect to tools). Connect it to Claude or any MCP client and ask in plain language, for example “What's the NVDA premium on Gapwatch?”. It is read-only, needs no key, and answers from the same cached data as this site.
https://gapwatch.xyz/api/mcpget_fair_price: one token's pool price, reference, premium, 2% depth and statuses (by ticker, for example NVDA).get_market_board: a compact list of every token with a pool, sorted by largest gap or symbol, optionally only thin pools or large_gap tokens (more than 5% from the reference).check_token: is this contract address an official Robinhood Stock Token (official, impersonation, similar symbol…)?Claude Code:
claude mcp add --transport http gapwatch https://gapwatch.xyz/api/mcpOther MCP clients (Streamable HTTP):
{
"mcpServers": {
"gapwatch": { "type": "http", "url": "https://gapwatch.xyz/api/mcp" }
}
}Same rules as the API: 60 requests per minute per IP (shared with the JSON API, counted per server instance), every value has a status and a reason, and every answer says it is not financial advice. A plain-text summary for AI tools is at /llms.txt.
A public Telegram channel (t.me/gapwatch_alerts (opens in a new tab)) posts when a token trades far from its reference and when it comes back. It checks every 5 minutes, so an alert can lag a move by up to about 10 minutes.
Alerts describe prices; they are not financial advice and not a signal to trade.