fintopic.

Guide · 7 min read · updated 1 Oct 2026

A news-attention and sentiment series for any ticker

How much is the news talking about a company, and in what tone? Hourly or daily, zero-filled, in one request, plus the normalisation that makes it comparable.

On this page
  1. Daily attention and tone
  2. Hourly, for the last week
  3. Normalise before you compare
  4. Other entities

Price tells you what the market did. News attention tells you what it is looking at. /v2/series turns the statements about one symbol, sector, theme or topic into buckets you can chart, join to prices or feed to a model.

Daily attention and tone

You need a RapidAPI key to run the examples: the free plan is enough.

import pandas as pd, requests

API = "https://finance-pulse.p.rapidapi.com"
HEADERS = {"X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY", "X-RapidAPI-Host": "finance-pulse.p.rapidapi.com"}

def series(**params):
    data = requests.get(f"{API}/v2/series", headers=HEADERS, params=params).json()["data"]
    return pd.DataFrame(data["buckets"]).set_index("t")

nvda = series(symbol="NVDA", interval="day", since="2026-09-17T00:00:00Z")
print(nvda[["count", "bullish", "bearish", "sources", "score"]].tail(5))
curl -G https://finance-pulse.p.rapidapi.com/v2/series \
  --data-urlencode "symbol=NVDA" --data-urlencode "interval=day" \
  --data-urlencode "since=2026-09-17T00:00:00Z" \
  -H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" -H "X-RapidAPI-Host: finance-pulse.p.rapidapi.com"
Output · captured 1 Oct 2026 11:34 UTC
t                       count  bullish  bearish  sources   score
2026-09-27T00:00:00Z      7        1        1        7   0.000
2026-09-28T00:00:00Z    118       70        2       45   0.576
2026-09-29T00:00:00Z     57       23        6       24   0.298
2026-09-30T00:00:00Z     30       14        1       16   0.433
2026-10-01T00:00:00Z     23       14        1       10   0.565

Every bucket carries the statement count, the sentiment counts, a breakdown by importance, the number of distinct sources (outlets) and the score, (bullish − bearish) / count. Buckets without statements are included with count: 0 and score: null, so the series has no holes to fill.

Daily NVDA statements by sentiment, and the score (bullish − bearish) / count.GET /v2/series?symbol=NVDA&interval=day&since=2026-09-17T00:00:00Z · captured 2026-10-01 11:34 UTC
Data table
daystatementsbullishbearishneutralsourcesscore
2026-09-1722133611+0.45
2026-09-1884133+0.38
2026-09-191330106+0.23
2026-09-2071067+0.14
2026-09-21431652219+0.26
2026-09-22135447+0.08
2026-09-2327136811+0.26
2026-09-24165477+0.06
2026-09-25158259+0.40
2026-09-2663033+0.50
2026-09-2771157+0.00
2026-09-281187024645+0.58
2026-09-29572362824+0.30
2026-09-30301411516+0.43
2026-10-0123141810+0.57

The spike on 28 September is the record buyback (three topics, from "largest stock buyback in history" to the $80 billion addition) together with an open-source AI security launch: 118 statements from 45 outlets in one day, against a typical 10 to 30. Attention, not tone, is the stronger signal here: NVDA's score is positive on almost every day.

Hourly, for the last week

interval=hour returns the last 7 days by default (up to 14 with since): 169 buckets, ready to resample.

Python
hourly = series(symbol="NVDA", interval="hour")
print(len(hourly), "hours,", int((hourly["count"] > 0).sum()), "with statements, busiest:",
      hourly["count"].idxmax(), int(hourly["count"].max()))
Output · captured 1 Oct 2026 11:34 UTC
169 hours, 89 with statements, busiest: 2026-09-28T11:00:00Z 17

Normalise before you compare

Raw counts move with the news cycle: a busy day for markets is a busy day for every ticker. Divide by the sector's series (the same request with sector) to get NVDA's share of InformationTechnology coverage, and demean the score per symbol, because each symbol has its own baseline tone:

Python
sector = series(sector="InformationTechnology", interval="day", since="2026-09-17T00:00:00Z")
features = pd.DataFrame({
    "share": nvda["count"] / sector["count"],             # NVDA's share of sector attention
    "tone": nvda["score"] - nvda["score"].mean(),          # tone against NVDA's own average
    "breadth": nvda["sources"],                            # how many outlets, not how many sentences
})
print(features.round(3).tail(5))
The same for the whole InformationTechnology sector: the baseline to normalise against.GET /v2/series?sector=InformationTechnology&interval=day&since=2026-09-17T00:00:00Z · captured 2026-10-01 11:34 UTC
Data table
daystatementsbullishbearishneutralsourcesscore
2026-09-173531425116052+0.26
2026-09-182641015410943+0.18
2026-09-1913633297432+0.03
2026-09-208618185024+0.00
2026-09-213631665913849+0.29
2026-09-2223089538846+0.16
2026-09-233591057717751+0.08
2026-09-2444514210320055+0.09
2026-09-253141016115252+0.13
2026-09-2619456508829+0.03
2026-09-2713652236137+0.21
2026-09-2863523014126462+0.14
2026-09-2970622711536483+0.16
2026-09-3083830711341896+0.23
2026-10-013461374216778+0.27

On 28 September NVDA took 18.6% of all InformationTechnology statements against a typical 3 to 9%: that, not the raw count, is the number that says "the market is suddenly reading about Nvidia".

Other entities

The same request works for exactly one of symbol, sector, theme_id or topic_id. Theme series show macro narratives (rates, energy, geopolitics); topic series show the life of a single story, the subject of Detecting developing stories.

Run this yourself: get a free API key on RapidAPI ↗. The free plan is enough for every example in this guide.