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
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
| Type | What triggers it | Typical length | reason on stocks.status |
|---|---|---|---|
| News pending | The company is about to release material news | Until shortly after the news is out | news_pending, then news_released |
| LULD pause | The price is stuck at its band for 15 seconds | 5 minutes, can be extended | volatility |
| Market-wide circuit breaker | The US 500 benchmark falls 7%, 13% or 20% from the prior close | 15 minutes, or the rest of the day | market_wide |
| Information requested | The listing exchange asks the issuer for more information | Until the answer is public | information_requested |
| Regulatory | Compliance, filing or suspension issues | Hours to days; up to 10 trading days for a regulator suspension | regulatory |
| Other | Corporate actions, operational problems, IPO openings | Varies | corporate_action, operational, ipo |
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.
A volatility pause, minute by minute (shape)
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
- -7%Level 1: every US stock halts for 15 minutes
- -13%Level 2: another 15-minute halt
- -20%Level 3: trading stops for the rest of the day
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:
| status | Meaning | What your app should do |
|---|---|---|
halted | Trading halted: news, regulatory or operational | Freeze the price, flag the symbol, stop order logic |
paused | Volatility pause, usually LULD | Expect a reopening auction within minutes |
quoting | Quotes are back, trading still halted | Show quotes as indicative; the first trade may gap |
resumed | Trading resumed | Clear the flag and treat the first prints with care |
- Halt ordered ahead of newsUS market to stocks.status
- status: halted, reason: news_pendingstocks.status to Your app
- News publishedUS market to stocks.status
- status: halted, reason: news_releasedstocks.status to Your app
- status: quotingquotes return, no trades yetstocks.status to Your app
- status: resumedstocks.status to Your app
A stocks.status frame
{
"type": "status",1
"channel": "stocks.status",
"asset": "stocks",
"symbol": "US:KO",3
"status": "halted",
"reason": "news_pending",2
"ts": 17435124000004
}
statusOne of halted, paused, quoting or resumed.reasonTickerLayer's own classification of why. Optional, and new values may be added, so decode it tolerantly.symbolMarket-qualified, as everywhere in the API. US listings only.tsEvent time in Unix milliseconds.
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
snapshotoption 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.
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())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
tswith 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.