QVeris
Stock API Comparison Guide

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 whiteboard comparing filters, free-tier limits, test requests, market coverage, data delay, and licensing

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 matches

The 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.

Authoritative references and related guides