A US stocks API can return a valid price while leaving an extended-hours screen misleading. For a product that shows pre-market, post-market or overnight activity, choose a feed whose coverage and session semantics you can verify, then keep each observation tied to its session and timestamp. TickDB documents separate extended-session snapshot objects; Alpaca documents separate stock feeds. Those are different integration choices, and neither removes the need to test missing data and session transitions.

Four separate panels represent pre-market, regular, post-market and overnight data.

Suppose an overnight price panel still displays the previous regular-session trade. The number may be accurate for that earlier observation, but the panel now makes a different promise. A successful request, a familiar ticker and a recent HTTP response do not establish that the price belongs to the session the user selected.

For this kind of product, the deciding question is whether the API lets you preserve that distinction all the way from the source to the screen. A regular-hours research tool can reasonably have a narrower requirement. An extended-hours monitor needs evidence for the additional sessions, symbols and uses it promises to support.

Feed choice and session choice answer different questions

A feed identifies the data source or coverage you requested. A session identifies the trading period represented by an observation. Keep both in your evaluation notes and in your application's normalized records. A label such as “US stocks” is too broad to settle either question.

Alpaca's Real-time Stock Data documentation lists SIP, IEX, delayed SIP, BOATS and a derived overnight feed separately. It also says a subscription without access to a requested feed will fail during authentication. For an overnight use case, ask which of these sources actually serves the required observation and whether the production account can access it. Do not assume that a regular-session connection proves overnight entitlement.

TickDB takes a different shape in its documented REST snapshot: pre-market, post-market and overnight observations can appear as separate objects. Each has its own price and timestamp, and the documentation makes their presence conditional on the product and data availability. That is useful when a screen must show sessions separately, but a documented optional object is not evidence that every symbol will always have it.

These examples illustrate interface choices, not a vendor ranking. A sample payload does not prove consolidated coverage, quote completeness, historical availability or redistribution permission. Resolve those requirements for the exact feed, account and application before a production commitment.

A price should retain the session it came from

During a trial, inspect the original response before reducing it to a single price field. If a requested session is unavailable, preserve that state. Falling back to another session may make a card look populated while silently changing its meaning.

For a TickDB overnight snapshot adapter, the proposed rule is straightforward: use the documented overnight object when it exists, along with that object's timestamp. If it is absent, report unavailable rather than borrowing the top-level price. The same discipline applies to pre-market and post-market objects. Do not label the top-level field as a regular-session close without separate evidence for that meaning.

A proposed TickDB snapshot adapter uses an overnight object's price and timestamp when present and returns unavailable when it is missing.

Figure 1. Proposed session-selection behavior. Optional fields remain optional; this is an adapter design, not a live response.

Preserve the original symbol, the requested source, the session label, the source timestamp and your own receipt time. The receipt time says when your application received the message. It does not, by itself, establish when the underlying market event occurred. Likewise, milliseconds or nanoseconds describe timestamp precision, not delivery speed.

Avoid using a generic “last updated” label for both clocks. An observation can be valid but old because no qualifying activity occurred, because the market is closed, or because the application has lost updates. Investigate those cases separately rather than treating every old timestamp as proof of a broken provider.

Use a calendar policy instead of a fixed UTC offset

Session classification needs a date, a market calendar and the source's documented rules. NYSE lists a normal core session of 9:30 a.m. to 4:00 p.m. Eastern Time, and its calendar includes holidays and early closes. Different venues also list different extended-hours schedules. That is enough to rule out one universal hard-coded UTC window for every US equity feed.

Use a timezone-aware calendar for the relevant venue or feed, including daylight-saving changes and exceptional days. For overnight data, also verify which trading date the provider assigns to events that cross midnight. A timestamp's local calendar date and the provider's trading date need not serve the same purpose.

The following small validator deliberately accepts a session window from the caller. It does not generate an exchange calendar or guess a session from a timestamp. Your provider-specific adapter must establish the normalized fields from the response and the configured feed; it must not invent a session label merely to make a record pass.

Turn the session requirement into an executable test

This Python example checks that an observation matches the requested symbol, feed and session, has a usable price, and falls inside a supplied half-open time window. The field names are an application schema, not a vendor API schema. The synthetic fixture verifies the local logic only; it does not query a market or measure a supplier.

from decimal import Decimal, InvalidOperation def accept_session(record, *, symbol, feed, session, start_ms, end_ms): # Windows are [start, end), supplied by your calendar policy. if not (type(start_ms) is int and type(end_ms) is int and start_ms < end_ms): raise ValueError("invalid test window") if record is None: return "unavailable" if not isinstance(record, dict): return "invalid_record" expected = {"symbol": symbol, "feed": feed, "session": session} if any(record.get(k) != v for k, v in expected.items()): return "scope_mismatch" ts = record.get("event_ms") if type(ts) is not int: return "invalid_timestamp" if not start_ms <= ts < end_ms: return "outside_session" try: price = Decimal(str(record["price"])) except (KeyError, InvalidOperation, ValueError): return "invalid_price" if not price.is_finite() or price <= 0: return "invalid_price" return "accepted" # Synthetic unit-test values, not a real trading session or price. case = dict(symbol="TEST.US", feed="fixture-feed", session="overnight", start_ms=1000, end_ms=2000) row = dict(symbol="TEST.US", feed="fixture-feed", session="overnight", event_ms=1500, price="10.25") assert accept_session(row, **case) == "accepted" assert accept_session(None, **case) == "unavailable" assert accept_session(dict(row, event_ms=999), **case) == "outside_session" assert accept_session(dict(row, session="regular"), **case) == "scope_mismatch" 

The accepted result means only that the record passed these checks. It says nothing about whether all trades were delivered or whether a quoted price is executable. The example also leaves freshness thresholds out intentionally: an appropriate threshold depends on the symbol, market state and product promise.

At ingestion, reject or quarantine records with an unknown source or session instead of filling those fields from the screen's current selection. Preserve the original payload alongside a rejected record so that a mapping error can be distinguished from missing source data. If the upstream format has finer timestamp precision than this millisecond example, retain the original precision where the application needs it.

Three proposed tests cover a session change, a missing session object and an event outside the requested time window.

Figure 2. Boundary tests target misleading output. Passing a sample does not establish complete market coverage.

A useful trial crosses a session boundary. Capture responses on both sides and check that the interface does not carry an earlier observation into the new session without a clear label. Then remove the requested session object from a saved fixture and confirm that the application shows unavailable. Finally, inject an event from outside the requested window and verify that the mismatch is reported rather than silently accepted.

Run these tests for the symbols and sessions the product actually needs. If a quiet symbol produces no observation, record that outcome and investigate its cause; do not turn the absence into an invented zero price or an unsupported claim that the feed lacks the symbol. A finite trial can expose failures, but it cannot prove complete future coverage.

Choose according to the product you will ship

For a regular-hours tool, a clearly bounded regular-session feed may be sufficient. For an extended-hours display, prefer an interface and entitlement package that let you identify the requested session, preserve its timestamp and represent missing observations honestly. For a cross-feed comparison, align source coverage and event types before treating price differences as errors.

A technical trial and a usage review answer different questions. Confirm the exact production access and permitted display or redistribution use with the provider; this article does not determine contractual rights. Keep unresolved requirements visible in the selection decision instead of interpreting an API success response as approval for every use.

The final acceptance condition is concrete: when the requested session changes or becomes unavailable, the product must still tell the truth about the price it displays. That is a stronger basis for choosing an extended-hours US stocks API than a demonstration that returns one plausible number.

Documentation checked November 10, 2026: TickDB REST Market Snapshot and WebSocket Ticker; Alpaca Real-time Stock Data; NYSE Holidays and Trading Hours. The code uses synthetic test fixtures, not live market results.

Disclosure: This article is prepared for TickDB's publication channels and discusses TickDB as one candidate. It is not an independent performance benchmark or investment advice.