Get started
Delayed quotes

Stock quotes and top movers,
delayed 15 minutes and clearly labeled.

Three endpoints cover the latest price picture: /v1/quotes for the last delayed trade, /v1/snapshot for price plus change from the previous close, and /v1/movers for each session's biggest gainers and losers. Quotes are delayed at least 15 minutes. They are not real-time.

Delayed last price

The last trade of the newest delayed snapshot, at least 15 minutes old, with the time it printed.

Snapshot in one call

Latest price, its source, previous close, change and percent change, plus the last two daily bars.

Top movers

Largest percent rises or falls between two session closes, filtered by price and volume.

Honest fields

Bid and ask fields exist in the schema but are always null today. No licensed source supplies them yet.

How delayed quotes work

U.S. listings are snapshotted every 10 minutes from 9:31 New York time until the delay has caught up with the close, at about 16:30. Each snapshot holds trades that are at least 15 minutes old. GET /v1/quotes returns the last trade from the newest snapshot as last_price, with last_at recording when that trade printed.

Because the final snapshot can include after-hours prints, last_price after the close can differ from the official closing price. When you need the close, read it from daily bars or from /v1/snapshot, where price_source is session_close.

FieldWhat it holds today
last_price, last_atLast trade in the newest delayed snapshot and when it printed
bid_price, ask_price, bid_size, ask_size, bid_at, ask_atAlways null. Reserved so clients need not change when a licensed source is added
symbol, exchange_mic, instrument_id, currency_codeListing identity

Mutual funds publish one NAV a day and have no quotes; read their NAV from /v1/eod. OTC listings have no quotes either.

Snapshots: price and change in one call

GET /v1/snapshot answers the question most dashboards ask: what is the price, and how far has it moved since yesterday? price is the delayed quote when it is from a newer trading date than the latest session, otherwise the latest official close. price_source tells you which (delayed_quote or session_close) and updated_at when it was observed.

previous_close is split-adjusted to the price's session, so a stock that split overnight does not show a 75% loss. change_percent is 100 × change / previous_close, rounded to 8 places. Every requested symbol comes back either as a row or as an entry in meta.errors, including listings with no quote and no session in the last 31 days.

Top gainers and losers

GET /v1/movers ranks listings by percent change from the previous session close to a session close, using reconciled end-of-day prices. It is a closing-price ranking, not an intraday scanner. By default it ranks the latest complete session; pass date to rank any session in your plan's history.

  • direction: gainers (default) or losers
  • limit: 1 to 50 rows, default 20
  • min_price: minimum close, default 1, so sub-dollar stocks are excluded unless you set 0
  • min_volume: minimum session volume, default 100000 shares
  • exchanges: limit to MIC codes such as XNYS,XNAS

Expect thinly traded, low-priced names at the top of an unfiltered ranking. Raising min_price and min_volume is usually the first thing to do.

Streaming delayed quotes

Pro and higher plans can subscribe over WebSocket instead of polling. A quote frame arrives when a new delayed snapshot is published for a subscribed symbol, using the same schema as /v1/quotes. Pro streams up to 250 symbols, Commercial 1,000 and Scale unlimited. The stream is delayed exactly like the REST endpoint. See streaming.

Plans, credits and display rights

Quotes, snapshots and movers are included on every plan, Free included. On Free they are limited to AAPL, NVDA, JNJ, PEP, MSFT, SPY and QQQ, and movers rank only those seven. Quotes and snapshots cost 5 credits per symbol, up to 100 symbols per request; movers cost 25 credits per request. Showing prices to other people in your product requires a Commercial or Scale plan.

Prices delayed 15 minutes or more. OHLC does not provide real-time quotes, bid/ask spreads, Level 2 data or consolidated tape (SIP) data.

Snapshot for Apple

RequestcURL
curl 'https://api.ohlc.io/v1/snapshot?symbols=XNAS:AAPL' \
  -H "Authorization: Bearer $OHLC_API_KEY"
Response · Illustrative sampleJSON
{
  "data": [
    {
      "security_id": "01M35H2KE2ZJHXFY5C3E7FPC66",
      "symbol": "XNAS:AAPL",
      "exchange_mic": "XNAS",
      "currency_code": "USD",
      "price": "333.69",
      "price_source": "session_close",
      "previous_close": "330.32",
      "change": "3.37",
      "change_percent": "1.02022281",
      "updated_at": "2026-10-02T20:00:00.000000Z",
      "quote": {
        "last_price": "333.69",
        "last_at": "2026-10-02T20:14:00.000000Z",
        "bid_price": null,
        "ask_price": null,
        "bid_size": null,
        "ask_size": null,
        "bid_at": null,
        "ask_at": null
      },
      "session": { "date": "2026-10-02", "open": "333.205", "high": "334.54", "low": "330.61", "close": "333.69", "volume": "31878433" },
      "previous_session": { "date": "2026-10-01", "open": "330.17", "high": "332.4816", "low": "325.81", "close": "330.32", "volume": "35017775" }
    }
  ],
  "meta": { "timezone": "UTC", "as_of": "2026-10-03T15:04:51Z", "next_cursor": null }
}

Prices delayed 15 minutes · Illustrative sample data

Questions, answered.

Is this a real-time stock quote API?

No. Every quote is at least 15 minutes old, from snapshots taken every 10 minutes during the session. last_at tells you exactly when the trade printed.

Why are bid and ask null?

No licensed source supplies bid and ask quotes to OHLC yet. The fields stay in the schema, always null, so your code will not need to change if one is added.

Is there a free stock quote API?

The Free plan includes delayed quotes, snapshots and movers for AAPL, NVDA, JNJ, PEP, MSFT, SPY and QQQ, with 12,500 credits a day and no card. Developer ($49/month) covers every U.S. stock and ETF, and Pro adds Canada, the UK, France, the Netherlands and Australia.

How often do quotes update?

Every 10 minutes from 9:31 to about 16:30 New York time on trading days, each snapshot delayed at least 15 minutes. Outside those hours the last snapshot stays in place.

Do top movers reflect intraday moves?

No. Movers compare session closes from end-of-day prices. For a stock's move during the session, use /v1/snapshot, which compares the delayed price with the previous close.

A little JSON.
A lot of possibility.

Explore the API