QVeris
Stock Data Developer Guide

Choose a Free Delayed Stock Quotes API
That Fits Your App

Compare 15-minute delays, timestamps, quote fields, rate limits, and usage rights before you integrate a free market-data endpoint.

Hand-drawn free delayed stock quotes API workflow from ticker symbol to price, bid and ask, volume, timestamp, and free-tier checks

TL;DR

Best for prototypes

A free delayed stock quotes API is usually enough for demos, personal dashboards, coursework, and low-traffic research tools.

Check the timestamp

“Real time” is not universal. Verify exchange, quote timestamp, session, and whether the response is delayed.

Define the quote

Latest trade, midpoint, bid, ask, and previous close are different values. Choose one explicitly for each product surface.

Design for limits

Cache repeated requests, batch symbols when allowed, and keep a provider adapter so you can switch later.

Use delayed quotes when the product explains markets rather than executes against them: educational screens, public company pages, low-frequency portfolio summaries, internal prototypes, and research that does not depend on the latest seconds. Do not use them to trigger orders, promise executable prices, calculate time-sensitive risk, or compare against a real-time feed without aligning timestamps. A “15-minute delay” describes data eligibility; polling every second cannot make the underlying quote newer.

Fields a delayed stock quote should include

A symbol and a number are not enough. Reliable applications need enough context to interpret the price correctly and avoid mixing incompatible values.

DataFields to expectUseCommon trap
Latest quotePrice, timestamp, currency, exchange, sessionWatchlists and snapshotsTreating delayed data as live
Bid and askBid, ask, sizes, quote timestampSpread and liquidity viewsConfusing a stale quote with a trade
Session contextMarket status, previous close, change, change %Correct daily movementMixing regular and extended hours
Symbol metadataCanonical symbol, name, type, market, statusSearch and validationTicker collisions across exchanges
Delay policyDelay duration, eligible venues, asset scope, session exceptionsCalculate when a quote becomes publishableAssuming every venue is delayed by the same amount
Time lineageMarket event time, provider release time, retrieval time, timezoneShow quote age and prove the delayTreating API response time as the quote time
Price typeBid, ask, midpoint, last eligible trade, official or previous closeLabel the value shown to usersCalling every returned number “stock price”
Display statusAs-of label, delayed badge, market open or closed, stale thresholdPrevent users from assuming live execution qualityHiding delay inside a tooltip or terms page

What “free” and “delayed” really mean

Request and daily quotas

Convert the advertised quota into your own workload: symbols × refreshes × users. A generous daily allowance can still fail if the provider enforces a tight per-minute burst limit.

Delayed or end-of-day prices

Free feeds may be delayed, end-of-day only, or limited outside regular sessions. Label the timestamp and delay in the UI instead of implying live execution quality.

Delay is different from staleness

A quote can be correctly delayed by 15 minutes and still be older because the security did not trade, the market is closed, or the feed stopped updating. Track both mandated delay and observed quote age.

Venue coverage affects meaning

Determine whether the quote comes from a consolidated feed, one exchange, an alternative venue, or a provider aggregate. A delayed single-venue last trade may differ from a delayed market-wide reference.

User-facing disclosure matters

Confirm required attribution, delay wording, display placement, and whether every user may view the data. Put the as-of time and delayed status beside the price, not only in legal text.

End-of-day is not the same product

A daily close published after the session does not provide a rolling delayed quote. Test during market hours and after close so the application can distinguish delayed intraday, official close, and previous close.

A resilient free delayed stock quotes API integration

Normalize once

Map provider-specific responses into your own Quote, Bar, and Instrument models. Keep raw payloads for debugging, but do not spread vendor field names through product code.

Cache by data cadence

Cache end-of-day history much longer than an active quote. Use explicit freshness rules and coalesce identical requests to protect the free quota.

Validate before storing

Reject impossible timestamps, negative prices, inconsistent currencies, duplicate bars, and unexpected timezone shifts. Record the provider and retrieval time.

Model the quote explicitly

Store bid, ask, last trade, official close, previous close, source venue, event time, delay class, provider release time, and retrieval time as distinct fields rather than one generic price.

Align refresh and cache with the delay

Polling faster than the release cadence wastes quota. Cache by symbol and price type until the next value can become eligible, while preserving a shorter failure retry policy.

Render honest states

Show delayed, as-of, market closed, stale, unavailable, and partial-coverage states. Do not display a cached value with a fresh page-load timestamp.

Block execution paths

Separate delayed-data services from order routing and time-sensitive alerts in code and policy. A later feature should not accidentally reuse a low-cost display feed for trading decisions.

Test boundary times

Verify the open, early close, regular close, daylight-saving changes, halts, and the exact moment a delayed event becomes available. Compare event time with expected release time.

Code pattern: distinguish mandated delay from a stale feed

The validator below keeps four ideas separate: when the market event happened, when the delayed quote became eligible for release, when the provider released it, and when your application retrieved it. The stale threshold is a product policy applied only while the market is open; it is not a claim that every symbol must trade continuously.

from datetime import datetime, timedelta

def parse_time(value: str) -> datetime:
    return datetime.fromisoformat(value.replace("Z", "+00:00"))

def classify_delayed_quote(quote: dict, now: datetime,
                           stale_after_minutes: int = 5) -> dict:
    event_time = parse_time(quote["event_time"])
    release_time = parse_time(quote["provider_release_time"])
    retrieved_at = parse_time(quote["retrieved_at"])
    delay = timedelta(minutes=quote["delay_minutes"])
    eligible_at = event_time + delay

    if quote["price"] <= 0:
        return {"status": "invalid", "reason": "non_positive_price"}
    if not event_time <= release_time <= retrieved_at <= now:
        return {"status": "invalid", "reason": "timestamp_order"}
    if release_time < eligible_at:
        return {"status": "invalid", "reason": "released_before_eligible"}

    quote_age = now - event_time
    allowed_age = delay + timedelta(minutes=stale_after_minutes)
    if quote.get("market_status") == "open" and quote_age > allowed_age:
        return {"status": "stale", "age_seconds": int(quote_age.total_seconds())}

    return {
        "status": "usable_delayed",
        "eligible_at": eligible_at.isoformat(),
        "age_seconds": int(quote_age.total_seconds()),
    }

Test the state, not only the price. A quote with event time 14:30Z, a 15-minute policy, provider release at 14:45Z, and retrieval at 14:45:02Z is valid delayed data. The same event returned at 14:55Z while the market is open is stale under the five-minute grace policy. If the market is closed or the symbol is halted, use that state instead of inventing a fresher price.

When to use QVeris for delayed quotes

QVeris helps developers and agents discover and inspect callable financial-data capabilities. Compare what a tool can return before wiring it into your application.

  • Search for quote, OHLCV, historical price, symbol lookup, and corporate-action capabilities.
  • Inspect inputs and outputs before calling a tool from your code or agent.
  • Keep provider selection separate from your normalized application model.

QVeris can help shortlist quote capabilities by fields, symbols, access requirements, and documented limits. The application still owns delay disclosure, timestamp lineage, venue interpretation, cache timing, stale-state policy, license compliance, and the separation between informational display and execution.

FAQ

Can I get real-time stock prices for free?

Sometimes, but coverage, exchanges, entitlements, and delays vary. Verify the timestamp and license instead of relying on a “real-time” label.

Can I request multiple stock quotes at once?

Some APIs support batch symbols, while others allow only one symbol per request. Check both the batch size and how each symbol counts against the free quota.

What does a 15-minute delayed quote mean?

It generally means an eligible market event is released no sooner than the applicable delay after its event time. Exact venues, sessions, fields, and policies vary, so inspect the documented delay class and timestamps.

Can delayed quotes be used for trading?

They should not drive time-sensitive order decisions or represent an executable price. They can support education, display, and low-frequency analysis when users see the delay clearly.

Why is a delayed quote older than 15 minutes?

The stock may not have traded, the market may be closed or halted, the field may update only on trades, or the feed may be stale. Compare event time, mandated delay, release time, and market status.

How should delayed prices be labelled?

Show the price type, “Delayed” status, source or coverage when required, and an as-of timestamp in the market’s timezone. The label should appear beside the value, not only in a footer.

External references