Forex session overlaps are the windows when two of the four regional trading sessions are open at the same time, and they concentrate most of what matters in the forex market: the heaviest volume, the tightest spreads, and the largest price moves. The market itself never pauses between Sunday 21:00 UTC and Friday 21:00 UTC, but activity across that week is far from uniform. Liquidity follows working hours around the globe, so a EURUSD quote at 14:00 UTC behaves very differently from the same quote at 21:30 UTC. If you're building a trading, research, or analytics system, the session map tells you when price updates arrive fastest, when a wide spread is normal rather than suspicious, and whether polling a REST endpoint or holding a WebSocket stream is the right transport.
The four forex sessions and their overlaps#
Session names refer to the banking hours of each region's dealing desks. Forex has no central venue, so these are conventions about where liquidity is being provided, and the commonly used boundaries, as published on SiftingIO's forex market hours page, are:
- Sydney: 21:00 to 07:00 UTC
- Tokyo: 00:00 to 09:00 UTC
- London: 07:00 to 16:00 UTC
- New York: 12:00 to 21:00 UTC
These UTC figures shift by an hour when local daylight saving changes, which is worth handling in code rather than hardcoding (more on that in the pitfalls).
Three overlaps fall out of that table. Sydney and Tokyo share 00:00 to 07:00 UTC, the Asia-Pacific block where USDJPY, AUDUSD, and NZDUSD see their liveliest trade. Tokyo and London share a short handover from 07:00 to 09:00 UTC. London and New York share 12:00 to 16:00 UTC, the deepest window of the entire day. There's also an anti-overlap: from 21:00 UTC, when New York closes, until Tokyo opens at 00:00 UTC, Sydney trades alone and liquidity is at its thinnest.
Why the London to New York overlap carries the most volume#
Two facts stack. The United Kingdom is the largest FX trading center and the United States is the second largest: the BIS Triennial Central Bank Survey (April 2022) attributed roughly 38% of global turnover to the UK and about 19% to the US. During 12:00 to 16:00 UTC both centers are fully staffed, so a majority of the world's dealing capacity is quoting simultaneously.
The overlap also contains the scheduled events. US economic releases such as CPI and the monthly jobs report land at 8:30 New York time, which falls inside the window, and many corporate and fund flows are executed there precisely because the market can absorb them.
The measurable consequences for a data consumer: spreads on majors like EURUSD and GBPUSD compress toward their daily tightest, ticks arrive more frequently because more quotes are being refreshed, and the high-low range per hour is typically the widest of the day. Tight spreads alongside high volatility might look contradictory, and it isn't. Depth means individual orders move price less, while heavy information flow means price travels further overall.
You can verify the pattern yourself instead of taking it on faith. Pull hourly bars and compare range by UTC hour:
curl --compressed -H "X-API-Key: $SIFTING_KEY" \
"https://api.sifting.io/v1/hist/forex/EURUSD/bars?interval=1h"
Group the bars by hour of day and average high minus low. The 12:00 to 16:00 UTC hours stand out, and the 21:00 to 00:00 UTC hours sit at the bottom. (Historical bar endpoints require gzip, hence --compressed.)
Spreads at the edges: rollover and the Sydney-only hours#
The reverse case matters just as much for anyone validating quotes. Two windows produce wide spreads that are normal and shouldn't be flagged as data errors.
The first is rollover at 5pm New York time (21:00 UTC during US daylight saving, 22:00 UTC in winter). This is the boundary of the FX trading day, when swap points for positions held overnight are settled. Many liquidity providers widen their quotes or briefly stop quoting around the cutover, so the aggregate bid-ask spread can jump to several times its overlap-hours width for a few minutes, even on EURUSD.
The second is the Sydney-only stretch between New York's close and Tokyo's open. With one regional center active, fewer venues are quoting, books are thin, and spreads on majors widen noticeably. Exotic pairs widen far more. A monitoring rule that flags any spread above a fixed threshold will page you every day shortly after 21:00 UTC. A saner rule keys the threshold to the session clock.
Polling REST or holding a WebSocket stream#
The session map translates directly into transport choices.
If you poll a snapshot endpoint:
curl -H "X-API-Key: $SIFTING_KEY" \
"https://api.sifting.io/v1/last/quote/forex/EURUSD"
every call spends quota whether or not the price moved. During the London and New York overlap the price moves nearly every second, so per-second polling at least returns fresh data. During the Sydney-only hours the same loop mostly re-downloads an unchanged quote. The arithmetic turns unfavorable fast, too: polling three pairs once a second is 180 requests per minute, triple the free tier's 60 requests per minute.
A WebSocket subscription inverts the cost model. Connect once and subscribe:
wss://stream.sifting.io/ws/v1?key=$SIFTING_KEY
{"op":"subscribe","product":"fx","symbols":["EURUSD","GBPUSD","USDJPY"]}
The server sends the last cached value immediately, then pushes updates as they happen: rapid-fire during the overlap, sparse overnight, with no request budget consumed either way. For anything that reacts to prices during the busy window (alerts, dashboards, signal evaluation), streaming is the correct default. REST polling remains fine for low-frequency jobs like an hourly treasury mark or end-of-day reporting. SiftingIO's forex data is served over both transports with the same symbols and one API key, so moving from polling to streaming is an afternoon of work.
Common pitfalls#
Daylight saving moves the overlaps. The 5pm New York rollover is pinned to local time, so its UTC position shifts twice a year, and the US and UK change on different dates. For a few weeks each March and again in the autumn, the London to New York overlap is offset from where your cron jobs expect it. Query the market hours API, or check the live schedule page, instead of hardcoding UTC constants.
Quiet hours can kill your WebSocket. The stream server closes any connection that sends no client frames for 90 seconds, and inbound ticks don't count. A client that subscribes once and then only listens will survive the busy hours and die overnight when it has nothing to say. Send {"op":"ping"} on a timer at least every 60 seconds, regardless of how much data is flowing in.
Measure session activity from ticks or range. To rank hours by how busy they are, count the ticks the stream delivers in each hour, or take the high-low range of every hourly bar and average it by UTC hour. Both track the session pattern directly, they need no extra reference data, and they read the same way across every pair.
Session overlaps are one of the few forex regularities that persist year after year, because they're driven by office hours rather than by strategy fashion. Build your polling cadence, alert thresholds, and reconnect logic around them, and both your data bill and your false-alarm rate go down. Start building free



