Developers
Free public API, no authentication required. Returns JSON with Cache-Control headers. Suitable for personal projects, research, and content creation.
Get the current liquidity score status including composite score, momentum, confidence, and key drivers.
curl https://dollarliquidity.com/api/regime{
"status": "neutral",
"momentum": "stable",
"confidence": "high",
"compositeScore": 0.29,
"previousScore": 0.29,
"percentile5y": 42,
"coverage": { "groups": 4, "totalGroups": 4, "indicators": 9, "totalIndicators": 10 },
"dataAsOf": "2026-05-20",
"drivers": [
{
"indicatorId": "tga",
"weight": 0.325,
"zScore": 1.1,
"contribution": 0.239,
"direction": "tightening"
}
],
"updatedAt": "2026-05-22T15:33:33.647Z"
}percentile5y is the 0-100 headline (≥80 tight, ≤20 loose); compositeScore is the legacy [-1,+1] form. coverage reports how many groups/indicators actually fed the score. dataAsOf is the latest data date the score reflects — updatedAt is only the recompute timestamp, not a data-freshness signal.
Cache-Control: public, s-maxage=3600, stale-while-revalidate=21600
Get the current Liquidity Lens snapshot: three independent axes (Quantity, Price, Structure), each with its own state and sub-readings, plus a structural-posture × tactical-pulse matrix cell. A separate product from /api/regime — never folded into one score.
curl "https://dollarliquidity.com/api/lens?lang=en"{
"quantity": {
"stance": "contracting",
"flow": -0.18,
"dial": 41,
"bufferPct": 11.2,
"bufferState": "thin",
"srfNonZeroShare90d": 0.03,
"realized": false,
"dataAsOf": "2026-08-26"
},
"price": {
"pathSpreadBps": 24,
"pathPricing": "neutral",
"realYieldPct": 1.92,
"realYieldTrendPp": 0.14,
"realYieldTrend": "rising",
"termPremiumPct": 0.34,
"termPremiumLevel": "normal",
"termPremiumTrendPp": -0.02,
"termPremiumTrend": "flat",
"curveContextBps": 48,
"dataAsOf": "2026-08-26"
},
"structure": {
"tgaFlow": 0.09,
"fiscalPulse": "draining",
"rrpBalanceB": 142.0,
"rrpBufferState": "depleted",
"billsShareContext": { "levelPct": 21.4, "direction6m": "rising" },
"fundingOverride": 0.12,
"dominantFundingLeg": null,
"cpTbillTiering": { "spreadBps": 14, "state": "normal", "trendBps": 2, "direction": "flat" },
"hyIgTiering": { "spreadBps": 118, "state": "normal", "trendBps": -3, "direction": "narrowing" },
"bankCashTiering": { "gapPp": 1.7, "state": "compressed", "trendPp": -0.5, "direction": "narrowing" },
"dataAsOf": "2026-08-26"
},
"synthesis": {
"cell": { "posture": "tightening", "pulse": "draining" },
"narrative": "…",
"dataAsOf": "2026-08-26"
},
"dataAsOf": "2026-08-26",
"updatedAt": "2026-08-27T06:00:11.203Z"
}Optional ?lang= (en/zh/zh-Hant/ja/ko/es/fr/de, default en) picks the locale for synthesis.narrative only — every other field is locale-independent. Any field is null, honestly, when the underlying series has not warmed up yet, never a fabricated neutral value.
Cache-Control: public, s-maxage=21600, stale-while-revalidate=86400
Get time series data for a specific indicator, including z-scores, percentiles, and metadata.
tga, fed-balance-sheet, onrrp, vix, hy-spread, real-yield-10y, dollar-index, sofr-iorb, srf, bank-cash-buffer, net-liquidity, m2
| Parameter | Type | Description |
|---|---|---|
days | number | Number of days (default: 365, max: 4000) |
curl "https://dollarliquidity.com/api/series/tga?days=90"{
"data": [
{ "date": "2026-04-20", "value": 1038.0, "zScore": 1.71 },
{ "date": "2026-05-20", "value": 782.0, "zScore": 0.98 }
],
"meta": {
"lastAvailableDate": "2026-05-20",
"zScoreMean": 441.14,
"zScoreStd": 349.53,
"percentile": 73,
"source": "fresh"
}
}data is sorted ascending by date — data[0] is the oldest point; the latest value is data[data.length − 1].
Get rolling correlations, lead-lag analysis, and score backtest data between the liquidity score and risk assets (BTC, SPX, QQQ, GOLD).
curl https://dollarliquidity.com/api/correlationCache-Control: public, s-maxage=900, stale-while-revalidate=1800
import requests
regime = requests.get("https://dollarliquidity.com/api/regime").json()
print(f"Status: {regime['status']}, Score: P{regime['percentile5y']}/100")
tga = requests.get("https://dollarliquidity.com/api/series/tga?days=30").json()
latest = tga["data"][-1] # data is ascending — the last element is newest
print(f"TGA: {latest['value']}B (z-score: {latest['zScore']})")const regime = await fetch("https://dollarliquidity.com/api/regime")
.then(r => r.json());
console.log(`Status: ${regime.status}, Score: P${regime.percentile5y}/100`);
const tga = await fetch("https://dollarliquidity.com/api/series/tga?days=30")
.then(r => r.json());
const latest = tga.data[tga.data.length - 1]; // ascending — last is newest
console.log(`TGA: ${latest.value}B`);Every error is JSON with the same envelope: `{ "error": { "code", "message", "hint", "docs" }, "status" }`. `code` is stable and machine-readable (for example `unknown_series`, `endpoint_not_found`); `hint` says what to do next. Unknown `/api/*` paths return 404 in this shape, never an HTML page.
{
"error": {
"code": "unknown_series",
"message": "Unknown series id "foo".",
"hint": "Valid ids: tga, fed-balance-sheet, … GET https://dollarliquidity.com/api lists every endpoint.",
"docs": "https://dollarliquidity.com/en/api-docs"
},
"status": 404
}Endpoint directory at `/api`. OpenAPI 3.1 at `/openapi.json` (alias `/.well-known/openapi.json`), an RFC 9727 API catalog at `/.well-known/api-catalog`, and `/llms.txt` for the site index. Every page also serves Markdown: send `Accept: text/markdown` or append `.md` to its path.