Free RSI API: Data, Limits & Python
Make RSI reproducible by fixing the source series, interval, period, smoothing, timestamp, and evidence.

TL;DR
Retrieve a 0–100 momentum oscillator for overextension, mean-reversion context, regime analysis, and price-versus-RSI divergence.
Preserve lookback, Wilder or alternative smoothing, input price, seed method, interval, adjustment policy, and edge-case behavior.
The API should return a measurement; overbought and oversold thresholds belong to the application and vary by trend, volatility, and asset.
QVeris helps agents discover technical-analysis capabilities and inspect their required inputs before calling them.
RSI is a calculation contract
Two APIs can both return “RSI(14)” and still disagree because source prices, interval boundaries, warm-up history, smoothing, timezone, and adjustment rules differ.
Parameter contract
| Parameter | Decision | Evidence to keep |
|---|---|---|
| symbol | Provider identifier and venue | Mapping and asset identity |
| interval | Minute, hour, day, or another bar window | Timezone and session boundary |
| period | Usually 14, but not universal | Exact integer and warm-up requirement |
| price | Close, adjusted close, or another series | Source field and adjustment policy |
| smoothing | Wilder, EMA-like, or provider-defined | Formula or provider documentation |
| timestamp | Time assigned to each output | Event window and provider timezone |
Minimum response shape
{
"symbol": "AAPL",
"interval": "1day",
"period": 14,
"timestamp": "2026-08-06T20:00:00Z",
"rsi": 58.42,
"source": "provider-name"
}API or local calculation
| Approach | Choose when | Risk to control |
|---|---|---|
| Provider API | You need a fast, maintained indicator endpoint | Formula opacity and quota |
| Local calculation | You control the price series and need reproducibility | Data cleaning and implementation tests |
| Dual calculation | The signal is important enough to cross-check | Define tolerance and disagreement handling |
Free RSI API response fields and parameters
An RSI indicator API returns a momentum oscillator, normally on a 0–100 scale, derived from average gains and losses over a lookback period. Fourteen periods is common, but interval, price series, smoothing, precision, and warm-up behavior differ. Treat each provider’s documentation as authoritative.
Confirm Wilder smoothing or another variant
Many services say “RSI” but use Wilder’s recursive averages, simple rolling averages, or a library-specific seed. Parameter length alone is not enough to reproduce the oscillator.
Test boundary behavior after one-sided moves
Check how the API handles zero average loss, zero average gain, flat prices, and insufficient history. Valid implementations may return 100, 0, 50, or null in specific edge states.
Treat 70 and 30 as context, not universal orders
Overbought and oversold thresholds depend on trend, volatility, interval, and asset. The API should return the measurement; strategy rules belong in your application and must be tested separately.
Preserve price source and completed-bar status
Record close versus adjusted close, interval, lookback, smoothing, timezone, and whether the current bar is final. Divergence analysis is meaningless if price and RSI use different timestamps.
Define divergence without hindsight
Bullish or bearish divergence requires explicit pivot rules, a comparison window, minimum price and RSI separation, and a confirmation time. If the application waits for future bars to confirm a pivot, label the signal at the time it became knowable—not at the earlier turning point—or a backtest will contain look-ahead bias.
Keep intervals independent
A 14-period RSI on one-minute bars is not interchangeable with the same period on hourly or daily bars. Store interval and session with every value, resample from a documented boundary, and do not join multi-timeframe signals until all contributing candles were complete at the decision timestamp.
Choose API output or local calculation deliberately
A direct endpoint is convenient for a few symbols and fixed parameters. Local calculation can be cheaper and more reproducible when you already retrieve OHLCV bars, need many periods, or want exact control over smoothing and seeding. Compare data rights and bar-call costs as part of the decision.
How to compare free technical indicator APIs
| Requirement | What to inspect | Why it matters | Failure signal |
|---|---|---|---|
| Endpoint access | Is RSI included in the free tier, demo, or paid plan? | A free key may not unlock every indicator. | Pricing and docs disagree. |
| Fields | RSI value, timestamp, symbol, interval, metadata. | Determines whether the response answers the task. | Only a chart or opaque score. |
| Parameters | Symbol, interval, time period, and series type. | Makes output reproducible and comparable. | Undocumented fixed defaults. |
| Quota & rights | Request weights, 429 behavior, caching, display, storage. | Defines safe polling and permitted use. | “Unlimited” without written terms. |
Documentation links
Free RSI API options versus calculating RSI locally
A documented RSI endpoint is convenient, but it is not automatically the cheapest or most reproducible choice. If the application already retrieves completed OHLCV bars, calculating RSI locally avoids an extra request per symbol and gives full control over smoothing, seeding, and revisions. A provider endpoint is more attractive when you need only a few values, want one normalized response across asset classes, or do not want to maintain indicator code.
| Option to test | Documented capability | Best fit | Free-tier question |
|---|---|---|---|
| Alpha Vantage RSI | The official RSI function accepts symbol, interval, period, and series type, supports equities plus FX or crypto symbols, and returns JSON or CSV. | A few direct indicator lookups across several asset classes with explicit parameters. | A free API key is available, but freshness, request limits, underlying bar entitlement, and commercial use must be checked for the intended interval. |
| Twelve Data RSI | Twelve Data documents a dedicated RSI endpoint for a specified instrument and period within its technical-indicator API family. | Applications already using Twelve Data symbols and time-series conventions for multiple markets. | Verify whether RSI is included in the current free plan, its credit weight, batch behavior, available intervals, and source-market delay. |
| Financial Modeling Prep RSI | FMP publishes a stable Relative Strength Index endpoint under its technical-indicators API. | Teams that already use FMP security identifiers and want indicator output beside other financial datasets. | Do not infer access from the public documentation page. Confirm the current subscription tier, historical depth, interval coverage, quota, and data license. |
| Local calculation from OHLCV | Compute gains and losses from a controlled close series, seed the initial averages, and apply Wilder's recursive smoothing under your own versioned implementation. | Large universes, many parameter sets, research reproducibility, and workflows that already license the source bars. | The bars are not automatically free to store or redistribute. Preserve their source, adjustment policy, completed-bar state, and license. |
Use a numerical fixture to prove two RSI implementations agree
Save at least 40 completed closes containing a flat segment, a one-direction run, a gap, and one adjusted-price event. Request a 14-period close-based RSI from the provider, then recalculate the same timestamps locally. Compare the first non-null timestamp, seed window, rounding, and every later value within a documented tolerance. If disagreement begins only after a corporate action or session gap, investigate the price series and adjustment rules before blaming the formula.
Decision rule: use the direct API when it passes the fixture, its quota covers the complete polling workload, and its bar rights match the product. Calculate locally when the same licensed OHLCV already powers several indicators or when exact reproducibility matters more than one-call convenience.
RSI API for Python: a safe integration path
Use a small local implementation as a numerical fixture for the provider response. The function below applies Wilder’s recursive smoothing, preserves the warm-up rows as None, and defines the flat, all-gain, and all-loss boundaries explicitly.
def wilder_rsi(closes: list[float], period: int = 14) -> list[float | None]:
if period < 2:
raise ValueError("period must be at least 2")
if any(value is None or value <= 0 for value in closes):
raise ValueError("closes must contain positive completed-bar values")
if len(closes) < period + 1:
return [None] * len(closes)
changes = [current - previous for previous, current in zip(closes, closes[1:])]
gains = [max(change, 0.0) for change in changes]
losses = [max(-change, 0.0) for change in changes]
average_gain = sum(gains[:period]) / period
average_loss = sum(losses[:period]) / period
values: list[float | None] = [None] * period
def score(gain: float, loss: float) -> float:
if gain == 0 and loss == 0:
return 50.0
if loss == 0:
return 100.0
if gain == 0:
return 0.0
relative_strength = gain / loss
return 100.0 - (100.0 / (1.0 + relative_strength))
values.append(score(average_gain, average_loss))
for gain, loss in zip(gains[period:], losses[period:]):
average_gain = ((period - 1) * average_gain + gain) / period
average_loss = ((period - 1) * average_loss + loss) / period
values.append(score(average_gain, average_loss))
return valuesCompare like with like. Run the fixture on the provider’s exact completed close series and compare only after matching interval, session, timezone, adjustment mode, period, seed, and rounding. A different first non-null timestamp usually indicates a seed or warm-up difference—not random numerical noise.
1. Confirm symbol, asset class, and interval
Resolve the instrument and venue first, then choose a supported interval such as daily or one hour. Do not assume the same ticker maps across providers.
2. Send one documented RSI request
Use the provider’s official HTTP or Python example with an API key stored on the server. Inspect the unmodified JSON before writing a mapper.
3. Normalize RSI JSON data
Parse timestamps with timezone awareness, convert numeric strings safely, preserve null warm-up values, and map the RSI value and calculation metadata explicitly.
4. Add rate-limit handling and caching
Respect request weights, back off after 429 responses, cache by completed-bar cadence, and retain provider, parameters, and retrieval timestamps.
5. Recalculate a fixed RSI fixture
Save a short close-price series with flat, rising, falling, and missing intervals. Reproduce the provider's seed and smoothing method independently, compare warm-up rows and timestamps, and set an explicit numeric tolerance. Include one corporate-action date when adjusted stock prices are supported.
6. Monitor for stale or revised values
Track source-bar age, completed-candle status, null rate, quota use, schema changes, and disagreement with the fixture. If the latest RSI is stale or a historical revision changes a prior signal, expose that state rather than silently carrying a value forward.
Inspect the RSI tool contract
Inspect symbols, intervals, calculation parameters, output schema, and provider identity before calling. Continue with QVeris RSI tool details, then confirm the calling contract in the QVeris REST API reference.
Free RSI API FAQ
Is there a free API for RSI data?
Yes. Some providers offer free tiers or demos for pre-calculated RSI. Check the current pricing and endpoint documentation because a free key may exclude the RSI function.
What does an RSI API return?
A useful response normally includes timestamps and RSI values, plus metadata for symbol, interval, series type, and time period. Inspect ordering, precision, and null warm-up rows.
How do I get RSI data in Python?
Send an authenticated HTTP request with a symbol and interval, parse the JSON, convert numeric strings safely, preserve timestamps, and handle rate limits and errors.
Can I get real-time RSI data from a free API?
Possibly, but source-market entitlements and free-plan rules vary. Verify the underlying bar timestamp and documented delay instead of inferring freshness from response speed.
