The same data the desk runs on.
Every number arrives through public JSON endpoints: no key, no account, no tracking. The desk's own composites sit beside public-domain passthroughs, with honest edge-cache windows documented below.
This page is for code.
You do not need JSON to read the market. Builders and agents can start with one request below; everyone else can use the same data through the daily brief or Ask.
- JSON endpoints
- 24
- MCP tools
- 23
- Credentials
- None
Start here.
Two calls tell you most of what you need. Responses below are truncated for the page; shapes are exact.
$ curl -s "https://dhawal.org/api/quotes?symbols=SPY,QQQ"
{"quotes":{"SPY":{"symbol":"SPY","last":751.71,"changePct":0.84,
"prevClose":745.40,"dayHigh":751.97,"dayLow":745.59, ...},
"QQQ":{...}},"fetchedAt":1783690000,"ttlSeconds":30}$ curl -s "https://dhawal.org/api/congress?ticker=NVDA&limit=2"
{"trades":[{"transactionDate":"2026-06-30","filingDate":"2026-07-08",
"ticker":"NVDA","type":"Sale (Partial)","side":"sell",
"amountLabel":"$15,001 - $50,000","member":"Sheldon Whitehouse",
"chamber":"senate","party":"D","state":"RI","daysToFile":8,
"late":false,"docUrl":"https://efdsearch.senate.gov/..."}, ...],
"count":2,"asOf":"2026-07-08","source":"congress-trading-monitor"}The endpoints.
Rendered from the same OpenAPI document the machines read, so this table cannot drift from the deployment. All endpoints are GET, all return JSON, and starred parameters are required.
| Endpoint | Parameters | What it returns |
|---|---|---|
| /api/quote | symbol* · e.g. ES=F uncurated · e.g. 1 | Delayed quote for a curated symbol. Yahoo primary, Finnhub equity fallback. Returns a normalised flat envelope with separate upstream observation and edge retrieval times. Edge cache TTL: 30s. |
| /api/macro | series* · e.g. VIXCLS,T10Y2Y,DTWEXBGS window asOf revisions · 1 vintageWindow | FRED macro series snapshots. Pulls the most-recent observation and prior-observation delta for each requested series. Optional history and ALFRED first-print revision comparisons retain release dates, current values, revision size, and sample size. The asOf parameter uses a FRED vintage date, so values and history reflect what FRED reports was published by that date. asOf cannot be combined with revisions=1. Up to 10 series per call. Edge cache TTL: 6h. |
| /api/cot | product* · e.g. ES | Commitments of Traders for one futures product. Returns the CFTC Legacy Futures-Only history plus the correct institutional report: TFF categories for financial contracts and Disaggregated categories for physical commodities. Every category includes net, weekly change, 52-week percentile, and sample size. Edge cache TTL: 24h. |
| /api/filings | symbol* · e.g. AAPL limit all · 0/1 insider · 0/1 | Recent SEC EDGAR filings for a US-listed symbol. Resolves ticker → CIK via SEC company_tickers.json, then fetches submissions. Material forms only by default. Edge cache TTL: 1h. |
| /api/wire | date* · e.g. 2026-05-14 | Daily editorial brief for /today. Drafted via OpenRouter (default model: nvidia/nemotron-3-super-120b-a12b:free, with a free-model fallback chain; override per-deploy with OPENROUTER_MODEL) and grounded in the dhawal.org markets data + macro-events config. Falls back to a deterministic, no-LLM composition (model: "deterministic") so the endpoint always returns 200. Edge cache TTL: 12h per date. |
| /api/crude-curve | · | NYMEX WTI crude oil futures curve (4 contracts). EIA-backed. Returns settlement prices for the front month plus three deferred contracts (PET.RCLC1..PET.RCLC4 daily series). The EIA republishes CME settlement data daily under a public-data-sharing agreement: no scraping, no rate limits, official source. Edge cache TTL: 6h. |
| /api/nat-gas-curve | · | NYMEX Henry Hub natural-gas futures curve (4 contracts). EIA-backed sister to /crude-curve. Returns settlement prices for the front month plus three deferred contracts (NG.RNGC1..NG.RNGC4 daily series). Same shape, same edge cache TTL (6h). |
| /api/earnings | from* · e.g. 2026-05-11 to* · e.g. 2026-05-15 | Earnings calendar for a date window. Sources from Finnhub /calendar/earnings. Edge cache TTL: 6h. |
| /api/movers | · | Top US gainers, losers, and most-active names. Yahoo predefined screeners (day_gainers / day_losers / most_actives), with a coverage-universe fallback when the screener is unreachable. Delayed data. Edge cache TTL: 5m. |
| /api/dividends | symbol* · e.g. AAPL | Dividend and split history for a covered symbol. Yahoo chart events (10y window). Derives trailing-12-month total, trailing yield, annual totals, and a growth streak counted over complete calendar years. Edge cache TTL: 12h. |
| /api/breadth | · | Equal-weight vs cap-weight breadth composite. In-house composite: deviation of today's RSP/SPY ratio from its 90-day mean, normalised 0-100. One optional leg of the macro regime; degrades to a 200 with null fields when the upstream is unreachable (never 5xx). Edge cache TTL: 6h. |
| /api/yield-curve | · | U.S. Treasury constant-maturity yield curve. Parses the U.S. Treasury nominal + TIPS real par-yield XML feeds. Returns the latest curve plus month-ago and year-ago ghost curves, the TIPS real curve (5Y+), and the 2s10s / 3m10y spreads. Public-domain source. Edge cache TTL: 6h. |
| /api/auctions | · | U.S. Treasury auction announcements and results. Treasury FiscalData auctions_query (public domain, fetched at build/edge). Returns announcements and bid-to-cover, high yield, allotment shares, and auction dispersion. True tail remains null because FiscalData does not publish the pre-auction when-issued yield. Degrades to empty arrays at 200 when unreachable. Edge cache TTL: 12h. |
| /api/econ-events | from · e.g. 2026-06-01 to · e.g. 2026-06-30 | Curated U.S. economic-release schedule for a window. Serves the in-house static MACRO_EVENTS schedule (FOMC, CPI, NFP, GDP, PCE, …). No upstream fetch, no key. This route cannot 5xx on an upstream. Edge cache TTL: 6h. |
| /api/options | symbol* · e.g. SPY | Options-chain analytics for a liquid underlying. CBOE delayed quotes, all derivation server-side: put/call ratios, max pain, gamma exposure, ATM IV term structure, 25-delta skew, and put/call data by strike. Whitelisted underlyings only. Edge cache TTL: 30m. |
| /api/fundamentals | symbol* · e.g. AAPL | Quarterly fundamentals for a US-listed symbol. SEC EDGAR XBRL companyfacts (public domain). Revenue / EPS / net income quarterly + annual series, shares-outstanding trend, and YoY deltas. Requires the SEC_USER_AGENT env binding. Edge cache TTL: 24h. |
| /api/news | category · e.g. markets | Aggregated news wire for a category. Aggregates free public RSS feeds, dedupes, and clusters related headlines (lead + also-covering outlets, developing flag). Every headline links to its original publisher. Edge cache TTL: 5m. |
| /api/gdelt | query* · e.g. federal reserve | Coverage-velocity timeline for a topic query. GDELT DOC 2.0 volume-intensity timeline (share of global coverage) for a sanitized query. Keyless public source. Edge cache TTL: 15m. |
| /api/quotes | symbols* · e.g. SPY,QQQ,^VIX | Batched delayed quotes for up to 50 curated symbols. Collapses the per-symbol quote fan-out into one request. Each quote separates upstream observation time from edge retrieval time. Non-curated or failed symbols are simply absent from the map. Edge cache TTL: 30s. |
| /api/congress | ticker · e.g. NVDA limit tickeredOnly · 0/1 | Congressional trading disclosures, newest filing first. STOCK Act periodic transaction reports from both chambers, parsed transaction-level by the open Congress Trading Monitor dataset (MIT, refreshed daily) and trimmed at the edge. Every row links to the primary government document (House Clerk / Senate eFD). Amounts are the statutory disclosure ranges, never exact figures. Edge cache TTL: 6h. |
| /api/insider | symbol* · e.g. AAPL | Form 4 insider transactions for a US-listed symbol. Opens the most recent Form 4 ownership documents on SEC EDGAR (up to 8 filings) and parses non-derivative transactions. Eligible open-market trades are ranked by transaction shares divided by holdings immediately before the trade, with explicit sample size. Edge cache TTL: 6h. |
| /api/health | · | Pipeline self-check. Re-runs the news wire aggregation, one index quote resolve, and a minimal model probe, reporting each leg. Overall status is ok only when the wire and the tape both pass; the model leg is reported but non-fatal (the Daily Wrap has a deterministic backstop). Edge cache TTL: 60s. |
| /api/statistics | metric* · price/macro/regime/breadth/… symbol series product lookback asOf | Delta Layer statistics for a desk metric. Computes 1-day, 1-week, and 1-month changes plus z-score and midrank percentile against prior final observations. The current observation never enters its own reference window. An optional date-level asOf cutoff selects the last retained final observation on or before that UTC date without admitting later observations. Macro and net-liquidity metrics use FRED vintage data. Regime, breadth, and _SPX options metrics use a verified content-addressed Machine Floor snapshot when the exact archive date exists. Other requests use observation-date mode over the latest available history, not upstream-vintage reconstruction. Every statistic reports sample size, temporal resolution, archive resolution, coverage, checksum provenance, and explicit missing-history state. Edge cache TTL: 15m. |
| /api/transcript-brief | symbol* · e.g. AAPL year quarter | LLM brief of a public earnings-call transcript. Summarises a public earnings-call transcript (The Motley Fool, with attribution + source link; earningscall.biz fallback) into a tone label, three takeaways, and a guidance-changed flag via OpenRouter. Returns 404 when no public transcript is available. Edge cache TTL: 7d. |
Every successful JSON GET response exposes three evidence headers. X-Dataset-Version names the response contract, X-Content-SHA256 hashes the exact bytes received, and X-Data-As-Of carries the payload's top-level observation or generation time when one is available. These headers are CORS-visible, so a saved request can verify its payload before parsing it.
The statistics endpoint supports an inclusive UTC observation-date cutoff, for example /api/statistics?metric=price&symbol=SPY&asOf=2024-10-12. It excludes every later observation and reports the date it actually resolved. This uses the latest available historical series, so it does not claim to reconstruct revisions that were unknown on that date.
FRED-backed macro requests go further. Adding asOf=YYYY-MM-DD sends that date to FRED as a vintage date, so later observations and revisions are excluded. Macro and net-liquidity statistics inherit this vintage policy. The response reports the requested vintage separately from the latest observation that was actually available within it.
Regime, breadth, and SPX options statistics can also resolve an exact retained Machine Floor date. A successful archive match returns the immutable artifact URL, its payload SHA-256, the archive date, and the underlying observation date separately. Dates without a retained snapshot stay on the explicitly labeled latest-history policy.
Fact-level evidence.
Cited Ask responses and the MCP get_brief tool use the same financial-fact-v2 envelope. A stable canonicalId identifies the sourced observation. Response-local labels such as F1 only connect answer prose to that fact inside one response.
Product, calculation method, primary source, and equivalent API response are separate destinations. A missing destination stays null and is described as an evidence gap. It is never replaced with a nearby link.
{
"statement": "The macro regime composite was 68.4/100.",
"rawValue": 68.4,
"formattedValue": "68.4/100",
"unit": "score out of 100",
"sourceName": "dhawal.org composite from FRED and Yahoo Finance",
"sourceUrl": "https://fred.stlouisfed.org/",
"artifactUrl": "/data/regime-history-source.json",
"productUrl": "/markets/",
"methodologyId": "macro-regime-composite",
"methodologyUrl": "/methodology/",
"apiUrl": "/api/macro",
"transformation": "macro-regime-composite",
"period": "Latest available observation for each leg",
"asOf": "2026-07-10T20:00:00.000Z",
"observationDate": null,
"observedAt": "2026-07-10T20:00:00.000Z",
"capturedAt": "2026-07-10T20:01:00.000Z",
"generatedAt": "2026-07-10T20:02:00.000Z",
"freshness": "delayed",
"expectedCadence": "each market session",
"limitation": "The composite is descriptive and may mix source observation dates.",
"canonicalId": "fact_0z7sbu8"
}This example is generated from the same typed fixture used by the OpenAPI FinancialFact schema and contract tests.
The terms.
Best effort, not an SLA: these endpoints run the live site first and your scripts second. Edge caching reduces repeated identical upstream work, but it is not client rate limiting or abuse protection. Be gentle and cache on your side too.
Attribute what you use: credit dhawal.org and the primary source named on each endpoint (FRED, CFTC, SEC EDGAR, the U.S. Treasury, the Congress Trading Monitor dataset, and so on), the same way this site credits them on every page. Endpoints evolve with the desk; material changes land in the changelog first.
Nothing here is investment advice. Delayed and derived data, disclosed methodology, and the same honesty rules as the rest of the site: how every number is computed is on the methodology page.
The machine spec.
The full OpenAPI 3.1 document, including response schemas for every envelope above, is served at /.well-known/api/v1/spec.json. Point an agent, a client generator, or a curious REPL at it; this page is rendered from the same document.
For agents, an MCP server.
The desk speaks the Model Context Protocol. An AI agent (Claude, ChatGPT, Cursor, or your own) connects once and calls the data live, so a person never has to copy a number out of a page and paste it into a chat. The endpoint is stateless Streamable HTTP, no key and no login:
https://dhawal.org/mcp
23 tools, including the canonical agent contract: ask_desk, get_quote, get_regime, run_screen, explain_signal, get_symbol, get_calendar, get_congress_trades, get_13f, get_dataset, get_brief, get_state_vector, find_analogs, and get_signal_performance. The original specialist tools remain available for options, COT, insiders, seasonality, the yield curve, and the news wire. The three institutional tools verify SHA-256 before returning an immutable evidence URL. get_regime is the compatibility alias for get_macro_regime. Calls return readable text and structured JSON where the result is tabular. Add it to Claude Code with:
$ claude mcp add --transport http dhawal https://dhawal.org/mcp
Agent instructions are also published at /skill.md, and aggregate-only tool traffic is visible on /machine. No prompt, argument, symbol, address, user agent, or session is recorded.
In Claude or ChatGPT, add it as a custom connector or developer-mode MCP server, pasting the same URL. It negotiates protocol revision 2025-11-25. No credentials to manage; the same terms as the JSON API apply.