Skip to content

US equity, ETF, and read-only option domain

P3 adds five registry-backed read tools: equity_etf_master, us_market_session, etf_data, equity_market_data, and option_chain. CLI + Skill, MCP, and REST use the same registry definitions and governed core operations.

Prepared security master reader

The prepared ETF database writer requires existing security master records. It does not insert hardcoded SPY issuer, exchange, industry or security rows while saving ETF observations. A missing parent fails the transaction; a failed batch commits no prefix. Test parent records are explicitly synthetic fixtures. Existing legacy master records still need source-evidence reconciliation, and this change does not establish current or historical ETF master coverage.

The prepared production etf_data package also verifies each typed record against one intact latest normalized source capture, including the raw checksum link and captured license terms. It rejects mismatched values, missing fields, late captures and unresolved same-time revisions. Its typed payload retains the four ETF record variants and replaces storage-only evidence labels with public source locators. Legacy missing license snapshots remain unknown. Typed rows alone cannot establish authorization, complete holdings or a verified permanent security identity; these gaps remain explicit partial results. Formal deployment and ordinary-user acceptance are still required.

The prepared production equity_etf_master implementation reads captured OpenFIGI mapping facts for an exact permanent identifier such as figi:BBG000B9XRY4. It returns original FIGI, composite/share-class identifiers, ticker, name, provider exchange code and security classifications, with source checksums, license scopes and evidence locators. The latest eligible capture is selected as one snapshot; missing fields are not taken from older responses. Both capture and public-known times must precede as_of. The prepared website request uses the actual AAPL FIGI and omits optional as_of to use the server's current query time. For historical queries, supply an explicit cutoff with verified captured coverage.

A mapping response alone does not establish listing status, the listing validity interval, trading currency or an issuer/company association. These remain explicit security_master_*_unavailable coverage gaps and the result is partial. An exchange code such as US is retained as the provider code; it is not reported as an ISO MIC. Unresolved identifiers and records without verified raw-capture links yield an empty result, with no fixture fallback.

This source change still requires release, deployment and verification of the promised universe and history. The existing public 1.1.7 service does not yet run this reader. The prepared reader is an implementation step toward the full security master contract; its partial records do not satisfy that contract's production completion criteria.

Point-in-time rules

ETF holdings are snapshots, not reconstructed estimates. Every holding has an effective_date, published_at, and known_at. A query includes a snapshot only when both its effective date is within the requested cutoff and its known_at is no later than as_of. It returns the latest eligible snapshot; it never relabels the current portfolio as an older snapshot. NAV and distributions use the same visibility rule. NAV premium/discount is validated against market price and NAV.

Corporate actions are visible only after known_at. Each adjustment factor names an adjustment_policy_id, policy version, and one or more corporate action IDs. An adjustment is returned only if all referenced actions are themselves visible. Symbol mapping events retain the permanent security ID and source action.

US sessions use America/New_York and return timezone-aware pre-market, regular, and post-market timestamps. Closed sessions contain no trading timestamps; early close sessions are explicitly typed.

The deterministic contract fixture currently carries the complete 2024 US market calendar under us-market-calendar-2024.1. Requests for another calendar year, or requests whose as_of predates publication of that calendar version, return an empty session set with structured provider_status.coverage_status=unavailable instead of extrapolating or fabricating a session.

The prepared production us_market_session reader uses persisted official calendar facts, with an exact MIC and session date. It shares the existing permission, output-policy, audit and source-evidence boundary. The 2024 fixture is confined to contract tests. A schedule may describe a future trading day already published by the exchange; its public-known and actual capture times must still precede as_of. Missing dates remain empty, and records lacking verified historical raw-capture links report partial coverage. They are not reconstructed from the fixture.

The production DataPackage exposes original normalized fields such as market_calendar.value.session_type, regular_open, regular_close, and calendar_version, with source licenses and evidence locators. Existing normalization represents a source JSON null as the string "null"; a closed session has no usable trading timestamp. This source change requires deployment and coverage verification before it describes the public production service.

Provider, quality, latency, and license status

The prepared market_session_fact_package implementation assembles actual captured market observations and the cited XNYS reference calendar for the requested US date. It does not turn the supplied symbols, session or date into vendor facts. Supply up to 100 distinct US symbols; SPY and SPY.US select the same explicitly US-qualified symbol, without inferring another market or a historical ticker mapping.

us_pre_market_close selects source pre-market open up to regular open, us_midday selects regular open up to noon in America/New_York, and us_regular_close includes the actual exchange close. Source half-days and DST times govern these boundaries. Daily bars are eligible only for regular close; they cannot prove an intraday result. Observations and their capture, known and license times must all be visible at as_of. Request parameters never replace missing calendar hours or source observations.

Returned market_observation.value.* fields retain provider timestamps, currency, interval, adjustment policy, source evidence, and captured license terms. Prices and quantities preserve decimal lexical values; missing quantity units are not inferred. Missing symbols have individual coverage gaps. A finite capture without a complete-session manifest remains partial, even when every requested symbol has observations. This prepared reader still requires formal deployment, ordinary-user verification and full range/provider coverage; an UNKNOWN EODHD license is not an entitlement.

The prepared equity_market_data, market_bars, market_quote, and market_trades wrapper keeps the existing payload JSON fact. Each returned observation must match an intact eligible raw-linked normalization capture for the actual permanent security ID, observation ID, provider, license, source values and extraction/mapping versions. It uses the latest capture, rejects conflicting captures, and preserves decimal strings. A later correction cannot be bypassed by matching an older capture. Receive/known and license capture times are taken from the selected capture rather than the query timestamp.

The package also returns its contributing market_observation.value.* facts, their actual source checksums and license scopes. These fields let the shared boundary enforce source field restrictions on the nested JSON result. Its observation evidence IDs are replaced with the exact source locators so evidence lookup closes against the raw capture. Captured UNKNOWN or missing license terms remain UNKNOWN, including in nested provider metadata; a successful query does not establish subscription or redistribution rights. Typed records without a matching source capture are omitted with an explicit coverage gap. Corporate actions, adjustments and mapping events without their own verified captures are also omitted with a gap. A finite capture remains partial until coverage is verified. These changes are prepared source and are not deployed on the existing public 1.1.7 service. Existing market record filters still require source policy eligibility; an administrative gate being disabled does not verify EODHD rights.

Every ETF, market, and option payload has a structured provider_status array. Each entry reports coverage, delay class and seconds, missing fields, license ID and status, redistribution, and availability restrictions. Missing or delayed fields are never hidden by a prose fallback.

Option boundary

Option output is limited to contract master, chain membership, quote values, open interest, volume, and provider-supplied greeks. Greek metadata includes provider, model name and version, input version and observation time, underlying price, and available rate, yield, and volatility inputs.

All option models are closed schemas. Strategy, signal, recommendation, position, portfolio, trade, account, order, ranking, or explanatory fields are invalid. Argus does not calculate trading meaning from option data.

P3 does not add screeners, sorting/ranking, dataset export, derived indicators, strategy execution, or any write-side market capability.