Developers

MoodTape API

Get live news sentiment for any stock or market as JSON. Use it in trading bots, spreadsheets, alerts and dashboards.

Authentication

API access is part of the Pro plan. Open the dashboard, choose API key from your account menu and create a key. Send it in the x-api-key header with every request. Keep it secret: anyone with the key can use your quota.

Endpoint

GET /api/v1/sentiment
ParameterTypeDescription
symbolstringStock or theme, e.g. RELIANCE, INFY, NVDA, NIFTY. Returns news about that symbol from the last 7 days.
marketIN · US · ALLUsed when no symbol is given. Market-wide headlines from the last 48 hours. Default ALL.
limit1–100Number of headlines to return. Default 30.

Example

curl "https://YOUR-DOMAIN/api/v1/sentiment?symbol=INFY&limit=5" \
  -H "x-api-key: mt_your_key_here"
{
  "query": { "symbol": "INFY", "name": "Infosys" },
  "mood": 66,
  "mood_label": "Greed",
  "net_score": 0.214,
  "counts": { "Bullish": 7, "Neutral": 3, "Bearish": 2 },
  "headline_count": 12,
  "tickers": [ { "sym": "INFY", "name": "Infosys", "sector": "IT", "mkt": "IN", "n": 12, "avg": 0.31 } ],
  "headlines": [
    {
      "title": "Infosys raises FY27 revenue guidance, announces buyback",
      "source": "Example News",
      "url": "https://…",
      "published_at": "2026-10-07T05:10:00.000Z",
      "score": 0.69,
      "label": "Bullish",
      "tickers": ["INFY"]
    }
  ],
  "fetched_at": "2026-10-07T05:30:00.000Z",
  "usage": { "used": 14, "limit": 1000 }
}

Fields

Errors

StatuscodeMeaning
401invalid_keyMissing or unknown API key.
402pro_requiredThe account behind the key is not on Pro.
429quotaDaily call limit reached. Resets at 00:00 UTC.
503api_not_configuredThe API is not enabled on this deployment.

Every error body looks like {"error":{"code":"quota","message":"…"}}.

Code samples

Python

import requests
r = requests.get("https://YOUR-DOMAIN/api/v1/sentiment",
                 params={"symbol": "RELIANCE"},
                 headers={"x-api-key": "mt_your_key_here"})
d = r.json()
print(d["mood"], d["mood_label"], d["net_score"])

JavaScript

const r = await fetch("https://YOUR-DOMAIN/api/v1/sentiment?market=IN", {
  headers: { "x-api-key": "mt_your_key_here" }
});
const d = await r.json();
console.log(d.mood_label, d.tickers.slice(0, 5));

Google Sheets (Apps Script)

function MOODTAPE(symbol) {
  const r = UrlFetchApp.fetch("https://YOUR-DOMAIN/api/v1/sentiment?symbol=" + symbol,
    { headers: { "x-api-key": "mt_your_key_here" } });
  return JSON.parse(r.getContentText()).net_score;
}

Fair use

Results are cached for a few minutes, so polling more often than every 5 minutes returns the same data. Headlines belong to their publishers; link to the original article when you display them.