Free Market Sentiment API
One sentiment reading per asset from -1 (bearish) to +1 (bullish) for 26 assets across crypto, equities, FX, indices and commodities. The score combines the tone of recent news with how traders are positioned, and each row carries its news, crowd and institutional components. Updated every 5 minutes.
Endpoints
/api/markets/sentimentLatest scores for all 26 assets in one window: window=24h by default; 5m, 15m, 1h, 7d and 30d also work.
/api/markets/sentiment/{slug}?history=7d|30d|allStored scores for one asset, newest first, up to 5,000 rows; history=7d (default) or 30d picks the series, and all returns the 30d series.
Rate Limit
10 requests a minute without a key, 30 with a free key
CORS
Open (*)
Auth
Optional X-API-Key header
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}`));Limits
- Updated every five minutes.
- Scores run from -1 to +1; higher is more bullish, and values near 0 are neutral.
- A component is null where it doesn't apply to an asset (no institutional component without a CFTC market, for example).
- A reading of news tone and positioning, not a forecast and not advice.
Main features
- A composite score and its components for 26 assets across crypto, equities, FX, indices and commodities, updated every five minutes.
- News, crowd and institutional components in the same row, each from -1 to +1.
- The Crypto Fear & Greed Index by alternative.me next to the crypto assets.
- Windows from five minutes to 30 days: 5m, 15m, 1h, 24h (the default), 7d and 30d.
- A per-asset history endpoint for charting how the score moved around market events.
Example
Request
curl "https://xoomar.com/api/markets/sentiment"
Response, live at 2026-10-17 15:42 UTC, trimmed
{
"data": {
"totalAssets": 26,
"window": "24h",
"cadence": "updates every 5 minutes",
"data": [
{
"slug": "aapl",
"name": "Apple",
"kind": "equity",
"window": "24h",
"timestamp": "2026-10-17T15:40:00.858Z",
"compositeScore": 0.0426,
"sentimentLabel": "NEUTRAL",
"newsLayer": {
"score": 0.0711,
"articlesCount": 19
},
"crowdLayer": {
"score": 0
},
"institutionalLayer": {
"score": null
},
"fearGreedIndex": null,
"divergenceAlert": {
"signal": "NEUTRAL_ALIGNED",
"message": "Components broadly agree; no positioning note."
},
"metadata": {
"sampleHeadlines": [
{
"title": "Apple has an iPhone trade-in perk that Americans are missing out on",
"score": -0.1,
"published_at": "2026-10-17T14:00:17.000Z"
},
{
"title": "Verizon will charge you $10 a month for iPhone Handoff",
"score": -0.6,
"published_at": "2026-10-17T13:45:16.000Z"
}
]
},
"canonicalUrl": "https://xoomar.com/markets/sentiment/aapl"
},
{
"slug": "audusd",
"name": "AUD/USD",
"kind": "fx",
"window": "24h",
"timestamp": "2026-10-17T15:40:00.858Z",
"compositeScore": 0.3316,
"sentimentLabel": "BULLISH",
"newsLayer": {
"score": 0,
"articlesCount": 0
},
"crowdLayer": {
...
}One record per asset for the requested window (window=24h by default). Scores run from -1 to +1; a component that doesn't apply to an asset is null.
What people build with it
Cross-asset dashboards
26 assets in one call: render a sentiment heatmap across crypto, equities, FX, indices and commodities with no joins.
Bot context
Read the composite and its components before an automated entry, and log them next to each trade for later review.
Event studies
The history endpoint shows how each score moved around earnings, CPI prints and other market events.
Research datasets
Pair the scores with your own price data to study how news tone and positioning line up with moves, asset by asset.
Fair use
No key needed to start. A 429 response carries a Retry-After header in seconds; cache responses on your side where you can. Need more volume? Write to info@xoomar.com.
Response shape
Every endpoint returns the same JSON envelope: { data, updatedAt, source, docs, license, attribution, meta }. In meta, source names who publishes the data and sourceAttribution is the credit line to show with it. The data field is an object with these fields:
| Field | Type | Description |
|---|---|---|
| totalAssets | number | Assets in the response |
| window | string | Window of the scores: 5m, 15m, 1h, 24h (default), 7d or 30d |
| cadence | string | How often the scores update |
| 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 | The window of this record |
| data[].timestamp | string | When this score was computed (ISO) |
| data[].compositeScore | number | One reading from -1 to +1 for the asset; higher is more bullish |
| data[].sentimentLabel | string | BULLISH, NEUTRAL or BEARISH: the band compositeScore falls in |
| data[].newsLayer | object | { score, articlesCount }: tone of recent headlines about the asset, -1 to +1, and how many headlines it covers |
| data[].crowdLayer | object | { score }: how traders are leaning on the exchanges right now (for stocks, how heavily the stock is sold short), -1 to +1; null where it doesn't apply |
| data[].institutionalLayer | object | { score }: institutional positioning from the CFTC report, -1 to +1; null where no CFTC market covers 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, message }: a note when the components point different ways, or agree strongly |
| data[].metadata | object | { sampleHeadlines }: up to three recent headlines about the asset, each with its tone from -1 to +1 |
| data[].canonicalUrl | string | The page on xoomar.com for this record |
Per-asset history at /api/markets/sentiment/{slug} returns flat rows, newest first: ts, window, composite, newsScore, newsCount, crowdScore, institutionalScore, fearGreed, divergenceSignal, divergenceMessage and metadata (scores as decimal strings).
Numeric fields typed string in the table carry exact decimals; parse them with your language's decimal type. No key needed to start: 10 requests a minute per IP without a key and 30 a minute with a free account key, with at least six months of history. A 429 response carries a Retry-After header in seconds. Credit XOOMAR with a link to the dataset page when you republish the data; the data terms are on the terms page.
A free account key raises the limit; send it in an X-API-Key header.
Frequently Asked Questions
What does the score measure?
How do I read the composite?
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.