Best Free Stock Screener API
Filters, Limits & Python
Compare free stock screening APIs by usable filters, market coverage, freshness, quotas, licensing, and a documented test request.
Best free stock screener API: choose by workload
There is no universal winner. A stock-screener API must provide a programmable way to filter an eligible universe—not merely fetch one ticker’s quote. The best fit exposes the required fundamental or technical filters, covers the target exchanges, returns a stable schema, and permits the intended use.
Choose by workload before choosing by brand. A server-side fundamental screen needs expressive conditions and reliable fiscal-period semantics; a live technical scanner needs broad quote coverage and synchronized timestamps; a small research notebook may work better with bulk data and local filtering; a historical strategy test requires point-in-time fundamentals, old universes, and delisted securities. One free plan rarely leads all four categories.
Shortlist: Business Quant currently documents a free POST screener with broad fundamental filters. Financial Modeling Prep documents a stock screener endpoint. Alpha Vantage, Finnhub, Twelve Data, Alpaca, and Massive can supply data for custom screens but may require client-side filtering. Verify each live plan.
Stock screener API filters and limits to compare
Filters, exchange coverage, freshness, pagination, rate limits, authentication, and licensing are separate pass/fail requirements. Confirm every one before comparing SDK convenience or response speed.
Fundamental stock screener API fields
Check P/E, market cap, revenue and earnings growth, margins, dividend yield, sector, country, exchange, currency, operators, null handling, and reporting periods.
Technical stock screener API signals
Confirm price, volume, moving averages, RSI, relative volume, interval, adjustment method, timestamp, and whether free data is real-time, delayed, or end-of-day.
Free stock API limits and market coverage
Record requests per minute and day, credits per endpoint, maximum rows, pagination cost, supported exchanges, symbol universe, history, and caching rules.
Authentication and commercial-use rights
A free API key is not automatically a production license. Verify display, storage, attribution, derived-data, redistribution, and commercial rights.
Server-side versus client-side screening
Server-side filters reduce bandwidth and request volume but constrain you to the provider's fields and operators. Client-side screens offer custom formulas but require a complete, consistently timestamped universe and enough quota to retrieve it.
Historical screening and research integrity
Ask whether an as-of date changes both the metrics and the eligible universe. Backtests need filing availability dates, historical classifications, restatement policy, and delisted names; current values attached to an old date are not point-in-time data.
Use a fixed four-stock fixture to verify filter semantics
Define the universe before the rules: US primary-listed common stocks, excluding ETFs and ADRs, observed at the June 30 close. Use only fundamentals that were publicly available by that cutoff. Apply market_cap_usd >= 1,000m, ttm_revenue_growth > 10%, and avg_dollar_volume_20d_usd >= 5m. Exclude a security when a required field is null rather than treating null as zero.
| Stable ID | Market cap | TTM revenue growth | 20-day avg dollar volume | Expected result |
|---|---|---|---|---|
| ALP | $1.2bn | 12.0% | $8.0m | Include: all rules pass |
| BRD | $1.0bn | 10.1% | $5.0m | Include: inclusive boundaries pass |
| CRN | $2.4bn | null | $20.0m | Exclude: required growth is missing |
| DLT | $3.0bn | 18.0% | $4.9m | Exclude: liquidity rule fails |
The API should return the same two matches and an explainable reason for each exclusion. Record whether market cap uses the closing price or a later quote, which four fiscal quarters form TTM revenue, how non-USD values are converted, and whether the threshold operators are inclusive. Without those details, two syntactically identical screens can implement different decisions.
Free stock screener API options to verify
This is a verification shortlist, not a permanent ranking. “Best” depends on whether you need server-side screening or raw data for client-side filtering. Build a scorecard before testing: assign pass/fail gates for market, security type, required fields, freshness, historical behavior, license, and budget; score convenience only after every gate passes. This prevents an attractive SDK or generous headline quota from masking a missing core capability.
| Provider | Documented signal | Best-fit task | Verify now |
|---|---|---|---|
| Business Quant | Free POST screener, AND/OR conditions, pagination, and broad fundamental metrics. | Server-side fundamental screening. | Key issuance, fair use, coverage, license. |
| Financial Modeling Prep | Documents a company screener endpoint and fundamentals. | Common filters and enrichment. | Current free access and quota. |
| Alpha Vantage | Stock time series, fundamentals, and technical indicators. | Small-universe local screens. | Daily limit, delay, bulk workflow. |
| Finnhub / Twelve Data | Quotes, fundamentals, indicators, and free-plan access. | Inputs for a custom technical screener. | Universe calls, credits, redistribution. |
Free stock screener API Python test workflow
1. Define a reproducible screen
Start with a small rule such as US common stocks, minimum market cap, positive revenue growth, and minimum average volume. Record units and null behavior.
2. Send the documented request
Use requests.post(url, params={"page":1,"limit":50,"api_key":api_key}, json={"filters":[...]}, timeout=20) only as a pattern; copy the exact endpoint, headers, operators, and body from official documentation.
3. Validate response and pagination
Call raise_for_status(), then verify unique symbols, exchanges, numeric types, currencies, timestamps, total rows, next-page behavior, empty results, and 429 handling.
4. Recheck freshness and license
Compare a sample with an exchange or issuer source, log retrieval time and provider, and retain storage, display, attribution, commercial-use, and redistribution terms.
5. Benchmark the same screen across candidates
Run one narrow and one broad screen at a fixed time. Compare eligible-universe count, matches, nulls, metric values, page stability, latency, credits consumed, and error behavior. Investigate disagreements rather than averaging them away.
6. Estimate the real free-tier workload
Translate headline quotas into complete screen runs. Include metadata calls, universe refreshes, pagination, retries, enrichment, and scheduled frequency. A plan with many requests can still be unusable if each symbol or metric costs a separate credit.
7. Shadow the preferred option before production
Run it on schedule without driving user actions. Track missing pages, schema drift, stale fields, quota exhaustion, changed match counts, and provider incidents, then define a fallback or safe failure mode.
Provider-neutral Python example. Replace the request keys and response adapter with the exact schema from the selected provider. The important behavior is preserving one snapshot across pages, validating stable security identity, treating required nulls as exclusions, and deduplicating before returning matches.
from decimal import Decimal, InvalidOperation
import requests
FILTERS = {
"as_of": "2026-06-30",
"security_type": "common_stock",
"country": "US",
"filters": [
{"field": "market_cap_usd", "op": "gte", "value": 1_000_000_000},
{"field": "ttm_revenue_growth", "op": "gt", "value": 0.10},
{"field": "avg_dollar_volume_20d_usd", "op": "gte", "value": 5_000_000},
],
"sort": ["market_cap_usd:desc", "security_id:asc"],
"limit": 100,
}
def as_decimal(row, field):
value = row.get(field)
if value is None:
return None
try:
return Decimal(str(value))
except InvalidOperation as exc:
raise ValueError(f"{field} is not numeric: {value!r}") from exc
def fetch_screen(endpoint, api_key):
cursor = None
snapshot = None
seen = set()
matches = []
with requests.Session() as session:
while True:
body = {**FILTERS, "cursor": cursor}
response = session.post(
endpoint,
headers={"Authorization": f"Bearer {api_key}"},
json=body,
timeout=(5, 30),
)
response.raise_for_status()
payload = response.json()
page_snapshot = payload.get("snapshot")
snapshot = snapshot or page_snapshot
if page_snapshot != snapshot:
raise RuntimeError("Provider snapshot changed during pagination")
for row in payload.get("results", []):
identity = (row.get("security_id"), row.get("exchange"))
if not all(identity):
raise ValueError("Stable security_id and exchange are required")
if identity in seen:
raise ValueError(f"Duplicate security across pages: {identity}")
seen.add(identity)
cap = as_decimal(row, "market_cap_usd")
growth = as_decimal(row, "ttm_revenue_growth")
liquidity = as_decimal(row, "avg_dollar_volume_20d_usd")
if None in (cap, growth, liquidity):
continue
if cap >= 1_000_000_000 and growth > Decimal("0.10") \
and liquidity >= 5_000_000:
matches.append(row)
cursor = payload.get("next_cursor")
if not cursor:
return matchesThe example intentionally accepts endpoint and api_key as inputs instead of inventing a live URL. In production, keep the key in a secret store, add bounded retry handling for transient failures, and record the normalized query, provider snapshot, retrieval time, page count, excluded-null count, and license version with the result.
Stable pagination rule: bind every page to the same as_of, normalized query hash, universe version, and provider snapshot token. Sort by the requested metric plus a stable security ID as a tie-breaker. If page two observes a newer market or fundamental snapshot than page one, changing ranks can create duplicates or skipped rows. When the API offers no snapshot token, retrieve the complete result in a controlled short window and reject the run if total count, query time, or boundary rows change during pagination.
How QVeris helps connect stock screening tools
QVeris does not create market data, grant data licenses, rank investments, or guarantee a provider. It helps developers and AI agents discover external capabilities, inspect inputs and outputs, and connect a selected tool through a consistent workflow.
- Open the QVeris provider details for stock screening and financial-data capabilities.
- Inspect provider documentation, authentication, operators, units, response shape, pagination, timestamp behavior, and known limitations before connecting.
- Give an agent explicit requirements for market, universe, filter logic, as-of date, null policy, sorting, result cap, and freshness instead of asking it for a vague “best screener.”
- Keep provider attribution, retrieval time, query version, and license notes with every result; capability access is not investment advice.
Best free stock screener API FAQ
Is there a free stock screener API?
Yes. Business Quant currently documents a free screener endpoint; other providers offer free tiers or data for custom screens. Verify quotas and terms.
Which free stock API is best for Python?
Choose the provider whose documented endpoint supports your filters and exchanges. Most REST APIs work with requests, so Python support alone is not decisive.
Can a free API screen stocks by fundamentals?
Some filter server-side by valuation, growth, margins, yield, sector, and market cap. Others require downloading data and filtering locally.
Is a free real-time stock screener API available?
Some plans offer limited real-time feeds, but a quote API is not automatically a full-market screener. Verify feed, delay, and universe.
Can I use free stock API data commercially?
Only when the current license permits the exact display, storage, derived-data, and redistribution use.
Which API is best for a fundamental stock screener?
Prefer a server-side screener with the required ratios, clear formulas and periods, compound conditions, stable pagination, and an explicit null policy. Test several metrics against issuer filings before relying on the ranking.
Which API is best for a technical stock screener?
Prioritize full-universe quote or bar coverage, synchronized timestamps, adjustment rules, interval support, and enough throughput to refresh the entire screen. A large indicator catalog is secondary if the inputs are stale.
How can two screeners return different stocks?
They may use different universes, filing periods, currency conversion, adjustment rules, timestamps, null policies, operators, or pagination snapshots. Compare the exact query and source values for a few included and excluded symbols.
