XOOMAR

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

GET
/api/markets/sentiment

Latest sentiment scores for all 20 tracked assets (all windows).

GET
/api/markets/sentiment/{slug}?history=7d|30d|all

Sentiment 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.

1

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.

2

Crowd and institutional layers

Funding rate percentiles and long/short ratios become the crowd layer; weekly COT net positioning becomes the institutional layer.

3

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:

FieldTypeDescription
totalAssetsnumberAssets in the response
windowstringAggregation window: 24h or 7d
cadencestringHow often scores are recomputed
dataarrayOne record per asset, latest scores
data[].slugstringAsset slug (btc, gold, sp500...)
data[].namestringDisplay name
data[].kindstringcrypto, fx, index, commodity or equity
data[].windowstring24h or 7d
data[].timestampstringWhen this score was computed (ISO)
data[].compositeScorenumberWeighted blend of the available layers, -1 (bearish) to +1 (bullish)
data[].sentimentLabelstringBULLISH above 0.2, BEARISH below -0.2, otherwise NEUTRAL
data[].newsLayerobjectscore (-1 to +1, null without articles) and articlesCount in the window
data[].crowdLayerobjectscore from funding-rate percentiles and long/short ratios
data[].institutionalLayerobjectscore from weekly COT net positioning; null where no COT market maps to the asset
data[].fearGreedIndexnumber | nullCrypto Fear & Greed Index by alternative.me (crypto assets only; credit alternative.me next to the value when you show it)
data[].divergenceAlertobjectsignal and message when the layers disagree
data[].metadataobjectInputs 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?
Three layers: news (AI-scored articles, weight 0.5), crowd (funding rates, weight 0.25), and institutional (COT positioning, weight 0.25). Missing layers are renormalized.
What does the composite score mean?
Range -1 to +1. Above +0.15 is bullish, below -0.15 is bearish. Values between are neutral. It represents the weighted opinion of news, retail, and institutional positioning.
Which assets are covered?
17 assets: 6 crypto (BTC, ETH, SOL, XRP, BNB, DOGE), 4 forex pairs (EUR/USD, USD/JPY, GBP/USD, AUD/USD), 3 indices (S&P 500, Nasdaq, Russell 2000), and 4 commodities (Gold, Silver, Oil, Copper).
Can I get historical sentiment?
Yes. Use the per-asset endpoint with ?history=30d or ?history=all for the full history since sentiment tracking began.

Data on this page is provided for informational purposes only and is not financial advice. See our editorial policy.