XOOMAR

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

GET
/api/markets/sentiment

Latest scores for all 26 assets in one window: window=24h by default; 5m, 15m, 1h, 7d and 30d also work.

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

Stored 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:

FieldTypeDescription
totalAssetsnumberAssets in the response
windowstringWindow of the scores: 5m, 15m, 1h, 24h (default), 7d or 30d
cadencestringHow often the scores update
dataarrayOne record per asset, latest scores
data[].slugstringAsset slug (btc, gold, sp500...)
data[].namestringDisplay name
data[].kindstringcrypto, fx, index, commodity or equity
data[].windowstringThe window of this record
data[].timestampstringWhen this score was computed (ISO)
data[].compositeScorenumberOne reading from -1 to +1 for the asset; higher is more bullish
data[].sentimentLabelstringBULLISH, NEUTRAL or BEARISH: the band compositeScore falls in
data[].newsLayerobject{ score, articlesCount }: tone of recent headlines about the asset, -1 to +1, and how many headlines it covers
data[].crowdLayerobject{ 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[].institutionalLayerobject{ score }: institutional positioning from the CFTC report, -1 to +1; null where no CFTC market covers 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[].divergenceAlertobject{ signal, message }: a note when the components point different ways, or agree strongly
data[].metadataobject{ sampleHeadlines }: up to three recent headlines about the asset, each with its tone from -1 to +1
data[].canonicalUrlstringThe 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?
The score combines the tone of recent news with how traders are positioned, into one reading per asset from -1 to +1, updated every 5 minutes; higher is more bullish. Each row also carries the news, crowd and institutional components.
How do I read the composite?
Positive readings lean bullish, negative readings lean bearish, and values near zero are neutral. sentimentLabel gives the band: BULLISH, NEUTRAL or BEARISH.
Which assets are covered?
26 assets: 9 crypto (BTC, ETH, SOL, XRP, BNB, DOGE, AVAX, LINK, SUI), 4 equities (Apple, Microsoft, NVIDIA, Tesla), 4 forex pairs (EUR/USD, USD/JPY, GBP/USD, AUD/USD), 3 indices (S&P 500, Nasdaq 100, Russell 2000), 5 commodities (gold, silver, WTI crude, natural gas, copper) and the US dollar index.
Can I get historical sentiment?
Yes. /api/markets/sentiment/{slug} returns the asset's stored scores, newest first, up to 5,000 rows; history=7d (the default) or 30d picks the series.

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