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"
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.
Data table
| day | statements | bullish | bearish | neutral | sources | score |
|---|---|---|---|---|---|---|
| 2026-09-17 | 22 | 13 | 3 | 6 | 11 | +0.45 |
| 2026-09-18 | 8 | 4 | 1 | 3 | 3 | +0.38 |
| 2026-09-19 | 13 | 3 | 0 | 10 | 6 | +0.23 |
| 2026-09-20 | 7 | 1 | 0 | 6 | 7 | +0.14 |
| 2026-09-21 | 43 | 16 | 5 | 22 | 19 | +0.26 |
| 2026-09-22 | 13 | 5 | 4 | 4 | 7 | +0.08 |
| 2026-09-23 | 27 | 13 | 6 | 8 | 11 | +0.26 |
| 2026-09-24 | 16 | 5 | 4 | 7 | 7 | +0.06 |
| 2026-09-25 | 15 | 8 | 2 | 5 | 9 | +0.40 |
| 2026-09-26 | 6 | 3 | 0 | 3 | 3 | +0.50 |
| 2026-09-27 | 7 | 1 | 1 | 5 | 7 | +0.00 |
| 2026-09-28 | 118 | 70 | 2 | 46 | 45 | +0.58 |
| 2026-09-29 | 57 | 23 | 6 | 28 | 24 | +0.30 |
| 2026-09-30 | 30 | 14 | 1 | 15 | 16 | +0.43 |
| 2026-10-01 | 23 | 14 | 1 | 8 | 10 | +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.
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()))
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:
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))
Data table
| day | statements | bullish | bearish | neutral | sources | score |
|---|---|---|---|---|---|---|
| 2026-09-17 | 353 | 142 | 51 | 160 | 52 | +0.26 |
| 2026-09-18 | 264 | 101 | 54 | 109 | 43 | +0.18 |
| 2026-09-19 | 136 | 33 | 29 | 74 | 32 | +0.03 |
| 2026-09-20 | 86 | 18 | 18 | 50 | 24 | +0.00 |
| 2026-09-21 | 363 | 166 | 59 | 138 | 49 | +0.29 |
| 2026-09-22 | 230 | 89 | 53 | 88 | 46 | +0.16 |
| 2026-09-23 | 359 | 105 | 77 | 177 | 51 | +0.08 |
| 2026-09-24 | 445 | 142 | 103 | 200 | 55 | +0.09 |
| 2026-09-25 | 314 | 101 | 61 | 152 | 52 | +0.13 |
| 2026-09-26 | 194 | 56 | 50 | 88 | 29 | +0.03 |
| 2026-09-27 | 136 | 52 | 23 | 61 | 37 | +0.21 |
| 2026-09-28 | 635 | 230 | 141 | 264 | 62 | +0.14 |
| 2026-09-29 | 706 | 227 | 115 | 364 | 83 | +0.16 |
| 2026-09-30 | 838 | 307 | 113 | 418 | 96 | +0.23 |
| 2026-10-01 | 346 | 137 | 42 | 167 | 78 | +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.