Explainer

Trading halts explained: LULD pauses, circuit breakers and halt reasons

A halt is the market saying the price cannot be trusted right now. Most apps find out when the quotes stop moving. You can find out from the event itself.

On this page
  1. What is a trading halt? The main types
  2. LULD: the five-minute volatility pause
  3. Market-wide circuit breakers
  4. Halt, quote-only, resume: the lifecycle
  5. Detect halted stocks in code with stocks.status
  6. What a halt looks like in your price data
  7. Questions

Key takeaways

  • A trading halt is a temporary stop in trading of one stock, or of the whole market, ordered by the listing exchange or a regulator.
  • An LULD volatility pause lasts five minutes and starts when a stock is stuck at its price band for 15 seconds; bands are 5% for large, liquid stocks priced above $3.
  • Market-wide circuit breakers halt every US stock for 15 minutes after a 7% or 13% fall in the US 500 large-cap benchmark before 3:25 p.m. ET, and close the market for the day at 20%.
  • News halts usually end shortly after the news is out; a regulatory suspension can last up to ten trading days.
  • TickerLayer streams US halt and resume events on the stocks.status WebSocket channel, with the statuses halted, paused, quoting and resumed and its own reason classification.

A trading halt is a temporary stop in trading of a stock, ordered by the exchange where it is listed or by a regulator. While a US stock is halted, no trades in it execute anywhere. Halts give everyone time to absorb pending news or let a violent move cool. The common kinds are news halts, limit up-limit down (LULD) volatility pauses, regulatory halts and, rarely, market-wide circuit breakers.

This explainer covers each kind, how long they last, and how to detect them programmatically, the part brokerage glossaries skip. If you build on a stock API, halts are the reason a perfectly healthy feed can go silent on one symbol in the middle of the afternoon.

What is a trading halt? The main types

TypeWhat triggers itTypical lengthreason on stocks.status
News pendingThe company is about to release material newsUntil shortly after the news is outnews_pending, then news_released
LULD pauseThe price is stuck at its band for 15 seconds5 minutes, can be extendedvolatility
Market-wide circuit breakerThe US 500 benchmark falls 7%, 13% or 20% from the prior close15 minutes, or the rest of the daymarket_wide
Information requestedThe listing exchange asks the issuer for more informationUntil the answer is publicinformation_requested
RegulatoryCompliance, filing or suspension issuesHours to days; up to 10 trading days for a regulator suspensionregulatory
OtherCorporate actions, operational problems, IPO openingsVariescorporate_action, operational, ipo
US equities. Lengths are general patterns, not rules: the listing exchange decides when trading resumes.

News halts are the most common single-stock halts people notice. A company about to announce a merger, a trial result or a regulatory decision asks its listing exchange to halt the stock so nobody trades on a leak. The news goes out, the market gets a few minutes to read it, and trading resumes, often at a very different price.

LULD: the five-minute volatility pause

Limit up-limit down is a guardrail around every stock's recent price. Each stock gets a band centred on its reference price, the average of its trades over the previous five minutes, and trades outside the band are not allowed. If buyers or sellers are stuck at the edge of the band for 15 seconds, the stock enters a five-minute trading pause, then reopens with an auction. If the auction cannot find a price, the pause is extended.

upper band = reference × (1 + p)lower band = reference × (1 − p)

reference
Average trade price over the previous five minutes, updated as the stock moves.
p
5% for large, liquid stocks priced above $3; 10% for other stocks above $3; 20% from $0.75 to $3.
US:KO with a reference price of 88.00 and p = 5%: bands at 83.60 and 92.40. In the first 15 minutes after the open the percentage doubles to 10%: 79.20 and 96.80.

A volatility pause, minute by minute (shape)

Illustrative. A stock with a reference price of 88.00 falls to its 5% band, pauses for five minutes with no trades (the flat stretch), and reopens by auction. In reality the band also drifts as the reference price updates.

Market-wide circuit breakers

Circuit breakers are the whole-market version, and they key off one number: the decline of the US 500 large-cap benchmark from the previous day's close.

Circuit breaker levels, stock market wide

  1. -7%Level 1: every US stock halts for 15 minutes
  2. -13%Level 2: another 15-minute halt
  3. -20%Level 3: trading stops for the rest of the day
Decline of the US 500 large-cap benchmark from the prior close. Levels 1 and 2 halt trading only if reached before 3:25 p.m. ET; Level 3 applies at any time.

They are rare. Level 1 tripped four times in March 2020, on the 9th, 12th, 16th and 18th, the first market-wide halts under the current rules, and each time trading resumed after 15 minutes. A Level 1 or 2 drop reached at or after 3:25 p.m. ET does not halt anything; only Level 3 can stop the market that late.

Halt, quote-only, resume: the lifecycle

A halt is a sequence, not a single event. On the TickerLayer stream each step arrives as one frame on the stocks.status channel, and its status field says where the stock is:

statusMeaningWhat your app should do
haltedTrading halted: news, regulatory or operationalFreeze the price, flag the symbol, stop order logic
pausedVolatility pause, usually LULDExpect a reopening auction within minutes
quotingQuotes are back, trading still haltedShow quotes as indicative; the first trade may gap
resumedTrading resumedClear the flag and treat the first prints with care
US marketstocks.statusYour app
  1. Halt ordered ahead of newsUS market to stocks.status
  2. status: halted, reason: news_pendingstocks.status to Your app
  3. News publishedUS market to stocks.status
  4. status: halted, reason: news_releasedstocks.status to Your app
  5. status: quotingquotes return, no trades yetstocks.status to Your app
  6. status: resumedstocks.status to Your app
An illustrative news halt. Which steps appear, and the reason on each frame, vary by event; a volatility pause often goes straight from paused to resumed.

A stocks.status frame

{
  "type": "status",1
  "channel": "stocks.status",
  "asset": "stocks",
  "symbol": "US:KO",3
  "status": "halted",
  "reason": "news_pending",2
  "ts": 17435124000004
}
  1. statusOne of halted, paused, quoting or resumed.
  2. reasonTickerLayer's own classification of why. Optional, and new values may be added, so decode it tolerantly.
  3. symbolMarket-qualified, as everywhere in the API. US listings only.
  4. tsEvent time in Unix milliseconds.
Frame shape from the stocks.status documentation; the values are an example, not a real halt.

The reason values are a coarse classification produced by our aggregation layer, not raw exchange codes: volatility, market_wide, news_pending, news_released, information_requested, regulatory, corporate_action, operational and ipo. The split is the one a subscriber acts on. A volatility pause resumes in minutes; a regulatory halt may not resume this week. The channel carries only the halt lifecycle: no auction imbalances, price indications or short-sale restriction notices.

Detect halted stocks in code with stocks.status

Subscribe to stocks.status with explicit US symbols, or with US:* for every US listing when the market wildcard add-on is enabled on your account. Three properties of the channel shape the client:

  • No snapshot. The channel never replays a status on subscribe, because a cached halt is a claim about the present that may no longer hold. The snapshot option has no effect here: you get the acknowledgement, then only events that happen after it.
  • Silence is normal. Most symbols never halt on a given day. A quiet channel is not a broken one, so do not alert on it.
  • Disconnects create doubt. A halt or a resume can happen while you are offline, and nothing replays it. After a reconnect, treat halted symbols as unknown until a live trade proves otherwise.

This client keeps a live list of halted stocks for a watchlist, which is also the most reliable way to answer "which stocks are halted today": build the list from the stream. It subscribes to trades as well, so a live print can clear a symbol whose status went stale during a disconnect. The WebSocket market data guide covers connecting and subscribing, and WebSocket reconnects the backoff logic.

halts.pyPython
import asyncio
import json
import os
import random
from datetime import datetime, timezone

import websockets  # pip install websockets (14 or newer)

URL = "wss://stream.tickerlayer.com/?apiKey=" + os.environ["TICKERLAYER_API_KEY"]
WATCHLIST = ["US:KO", "US:JPM", "US:DIS", "US:BA", "US:GE"]
NOT_TRADING = {"halted", "paused", "quoting"}

state = {}  # symbol -> last known status; "unknown" after a reconnect


def on_status(msg):
    reason = msg.get("reason", "unclassified")  # optional field: decode tolerantly
    when = datetime.fromtimestamp(msg["ts"] / 1000, timezone.utc)
    state[msg["symbol"]] = msg["status"]
    print(f"{when:%H:%M:%S} UTC  {msg['symbol']:<7} {msg['status']:<8} {reason}")
    stopped = sorted(s for s, v in state.items() if v in NOT_TRADING)
    print("  not trading now:", ", ".join(stopped) or "none")


async def stream():
    async with websockets.connect(URL, compression=None, open_timeout=10) as ws:
        ready = json.loads(await ws.recv())
        if ready.get("event") != "ready":
            raise RuntimeError(f"expected ready frame, got {ready}")
        await ws.send(json.dumps({
            "action": "subscribe",
            "channels": ["stocks.status", "stocks.trades"],
            "symbols": WATCHLIST,
        }))
        async for raw in ws:
            msg = json.loads(raw)
            if msg.get("type") == "status":
                on_status(msg)
            elif msg.get("type") == "trade" and not msg.get("snapshot"):
                if state.get(msg["symbol"]) == "unknown":
                    state[msg["symbol"]] = "resumed"  # a live print proves trading is on
            elif msg.get("type") in ("system", "error"):
                print("control:", msg)


async def main():
    backoff = 1.0
    while True:
        try:
            await stream()
        except (websockets.ConnectionClosed, OSError, asyncio.TimeoutError) as exc:
            # No snapshot on stocks.status: a halt or resume may have happened while away.
            for symbol, status in state.items():
                if status in NOT_TRADING:
                    state[symbol] = "unknown"
            print(f"disconnected ({exc!r}); reconnecting in {backoff:.0f}s")
        await asyncio.sleep(backoff + random.uniform(0, backoff / 2))
        backoff = min(backoff * 2, 30.0)


if __name__ == "__main__":
    asyncio.run(main())
Output (US pre-market, September 28, 2026)
control: {'type': 'system', 'event': 'subscribed', 'channels': ['stocks.status', 'stocks.trades'], 'symbols': ['US:BA', 'US:DIS', 'US:GE', 'US:JPM', 'US:KO']}

No halts hit the watchlist during that run, which is the normal case: the acknowledgement arrives, then nothing. When a status event does arrive, the client prints its UTC time, symbol, status and reason, followed by the current list of symbols that are not trading. Note the server sorted the symbols in the acknowledgement; match on content, not order.

What a halt looks like in your price data

If you consume only quotes and trades, a halt shows up as absence. The last trade stops updating and its ts grows old, quotes may freeze or disappear, and minute bars simply do not exist: stocks.agg publishes no bar for a minute without trades, so a halted stretch is a gap in the series, not a flat line. Then the stock reopens, often at a different price, and a naive chart draws a cliff. Halts in pre-market and after-hours trading look the same, on even thinner volume.

Do

  • Flag halted symbols in the UI instead of showing a stale price as live.
  • Compare the last trade ts with the current time before acting on a price.
  • Expect a gap at the reopen and keep it out of volatility alerts.
  • Reset halt state to unknown after every reconnect.

Avoid

  • Treating a quiet symbol as a feed outage and failing over.
  • Filling missing bars with the last price during a halt.
  • Firing a "price unchanged" alert on a stock that cannot trade.
  • Assuming a status from before a disconnect still holds.

Questions

What is a trading halt?

A temporary stop in trading of a single stock, or of the whole market, ordered by the listing exchange or a regulator. No trades execute while it lasts, and quotes may be withdrawn or shown only as indications.

How long do trading halts last?

LULD volatility pauses last five minutes unless extended, market-wide circuit breakers 15 minutes or the rest of the day, and news halts usually until shortly after the news is out. Regulatory suspensions can last up to ten trading days.

What is LULD?

Limit up-limit down, the US mechanism that stops a stock from trading outside a band around its five-minute average price. If the price is stuck at the band for 15 seconds, trading pauses for five minutes.

What triggers a stock market circuit breaker?

A 7% (Level 1) or 13% (Level 2) fall in the US 500 large-cap benchmark from the prior close halts all US stocks for 15 minutes if it happens before 3:25 p.m. ET. A 20% fall (Level 3) closes the market for the rest of the day.

Can you sell a stock when it is halted?

No trades execute during a halt. Some brokers let you place or cancel orders so they are ready for the reopening auction, but an order fills only after trading resumes, often at a different price.

How do I find halted stocks today?

Exchanges and brokers publish halt lists. In code, subscribe to the stocks.status WebSocket channel and keep the symbols whose latest status is halted, paused or quoting.

Keep reading

Ready to integrate?

Start with the free tier, explore the docs, and connect via REST or WebSocket in minutes.