Free Market Sentiment API
AI-scored per-asset sentiment combining three layers: news analysis, crowd positioning (funding rates), and institutional flows (COT). Updated every hour. Others charge for sentiment feeds; ours runs on our own news coverage and public positioning data.
Endpoints
/api/markets/sentimentLatest sentiment scores for all 20 tracked assets (all windows).
/api/markets/sentiment/{slug}?history=7d|30d|allSentiment history for a specific asset.
Rate Limit
30/min · 120 keyed
CORS
Open (*)
Auth
None
Examples
curl
curl https://xoomar.com/api/markets/sentiment/btc
Python
import requests
r = requests.get("https://xoomar.com/api/markets/sentiment")
for row in r.json()["data"]["data"]:
print(f"{row['slug']}: {row['sentimentLabel']} composite {row['compositeScore']}")JavaScript
const res = await fetch("https://xoomar.com/api/markets/sentiment/btc?history=30d");
const { data } = await res.json();
data.forEach(r => console.log(`${r.ts}: ${r.composite}`));Honest Limits
- Recomputes hourly. Not a real-time feed.
- News layer scored by our language models from our own coverage; crowd layer from funding rates; institutional from COT positioning.
- Score range is -1 to +1. Values near 0 are neutral.
- Not all layers are available for all assets (e.g., COT layer is null for crypto assets without CME futures).
Main Features
- ✓Multi-layer sentiment for 17 assets across crypto, FX, indices, and commodities, recomputed every hour.
- ✓Three independent layers per asset: AI-scored news coverage, crowd positioning from funding and ratio data, and institutional positioning from COT.
- ✓Composite score with transparent weights (news 0.5, crowd 0.25, institutional 0.25) and null-safe renormalization when a layer has no data.
- ✓Both 24h and 7d windows per asset, plus the Crypto Fear & Greed Index for crypto assets.
- ✓Per-asset history endpoint for charting how sentiment evolved into and out of market events.
How It Works
Each layer has its own clock; the aggregate runs hourly.
News scoring
Our pipeline's AI reads incoming market news and scores each relevant article from -1 (bearish) to +1 (bullish) per asset, then aggregates over 24h and 7d windows.
Crowd and institutional layers
Funding rate percentiles and long/short ratios become the crowd layer; weekly COT net positioning becomes the institutional layer.
Blending
The composite renormalizes weights across whichever layers have data, so a missing layer never silently zeroes the score. We unit-test this math.
Real Example
Request
curl "https://xoomar.com/api/markets/sentiment"
Response (captured live, trimmed)
{
"data": {
"totalAssets": 26,
"window": "24h",
"cadence": "5-minute sliding window",
"data": [
{
"slug": "btc",
"name": "Bitcoin",
"kind": "crypto",
"window": "24h",
"timestamp": "2026-09-14T14:25:00.828Z",
"compositeScore": 0.5065,
"sentimentLabel": "BULLISH",
"newsLayer": { "score": 0.21, "articlesCount": 14 },
"crowdLayer": { "score": 0.0129 },
"institutionalLayer": { "score": 1.0 },
"fearGreedIndex": 12,
"divergenceAlert": { "signal": "NEUTRAL_ALIGNED", "message": "Components broadly agree; no positioning note." },
"metadata": { "cot": null, "dvol": 37.97, "window": "24h" }
}
]
},
"updatedAt": "2026-09-14T14:30:00.000Z",
"source": "xoomar.com",
"docs": "https://xoomar.com/markets/api"
}One record per asset with the latest scores for the requested window (?window=24h or 7d). Scores are numbers from -1 to +1; a layer with no data has score null and is left out of the composite.
What People Build With This
Contrarian screens
Extreme bearish news sentiment plus washed-out crowd positioning is a classic capitulation pattern. Both layers arrive in the same row.
News-driven bot filters
Bots pause entries when 24h news sentiment crosses a threshold against the trade direction.
Cross-asset dashboards
17 assets in one call: render a sentiment heatmap across crypto, FX, indices, and commodities with zero joins.
Event studies
The history endpoint lets you measure how long sentiment shocks take to mean-revert per asset class.
Pricing and Fair Use
Free. No API key, no signup, no credit card. We rate limit per IP to keep the service fast for everyone; a 429 response carries a Retry-After header telling you exactly when to retry. Cache responses on your side where you can. If you are building something that needs guaranteed volume, contact us first instead of hammering the endpoint.
Response Shape
Every endpoint returns the same JSON envelope: { data, updatedAt, source, docs }. The data field is an object with these fields:
| Field | Type | Description |
|---|---|---|
| totalAssets | number | Assets in the response |
| window | string | Aggregation window: 24h or 7d |
| cadence | string | How often scores are recomputed |
| data | array | One record per asset, latest scores |
| data[].slug | string | Asset slug (btc, gold, sp500...) |
| data[].name | string | Display name |
| data[].kind | string | crypto, fx, index, commodity or equity |
| data[].window | string | 24h or 7d |
| data[].timestamp | string | When this score was computed (ISO) |
| data[].compositeScore | number | Weighted blend of the available layers, -1 (bearish) to +1 (bullish) |
| data[].sentimentLabel | string | BULLISH above 0.2, BEARISH below -0.2, otherwise NEUTRAL |
| data[].newsLayer | object | score (-1 to +1, null without articles) and articlesCount in the window |
| data[].crowdLayer | object | score from funding-rate percentiles and long/short ratios |
| data[].institutionalLayer | object | score from weekly COT net positioning; null where no COT market maps to the asset |
| data[].fearGreedIndex | number | null | Crypto Fear & Greed Index by alternative.me (crypto assets only; credit alternative.me next to the value when you show it) |
| data[].divergenceAlert | object | signal and message when the layers disagree |
| data[].metadata | object | Inputs behind the layers (cot, dvol, orderflow) for the curious |
Per-asset history at /api/markets/sentiment/{slug}?history=7d|30d|all returns flat rows: ts, window, composite, newsScore, newsCount, crowdScore, institutionalScore, fearGreed, divergenceSignal, divergenceMessage, metadata (scores as decimal strings, oldest first).
Numeric values arrive as strings where precision matters (prices, rates); parse with your language's decimal type for accounting-grade math. Rate limiting is fair-use per IP; a 429 response includes a Retry-After header. No authentication or API key needed. Attribution is appreciated: xoomar.com/markets.
Need more headroom? A free account raises your limit to 120 requests a minute with an X-API-Key header.
Frequently Asked Questions
How is the sentiment score calculated?
What does the composite score mean?
Which assets are covered?
Can I get historical sentiment?
Data on this page is provided for informational purposes only and is not financial advice. See our editorial policy.