This page details the "Market-data lookup" tentative card on Roxy's status page. It is the deliberately thin version: Roxy fetches a single end-of-day price on demand, names the source, states the as-of date, and stores nothing. No market-data warehouse, no live feed, no positions.
Status (August 16, 2026): live on demand. Roxy fetches end-of-day prices from Alpha Vantage (e.g. AAPL 2026-08-14 = $305.93). One caveat from the build: only the raw tape close is available on the free tier — split/dividend-adjusted close and full history are premium-blocked, so the script returns the raw close (clearly labeled) and refuses rather than guess when adjusted data is asked for. It is the easiest of the three builds and the one closest to a rail Roxy must not cross, so the plan is mostly about the guardrails, not the code.
Build log — August 16, 2026. Provider chosen: Alpha Vantage. James signed Bob up for an Alpha Vantage API key and emailed it to Roxy. Roxy is to store the key in her secret store (never in this page, a memory note, a chat log, or any answer she returns), confirm it is retrievable, and then treat the delivery email as spent. The key itself is not recorded here by design.
Bob asks Roxy for the closing price of a security on a given day. Roxy fetches it live from one named provider and answers with the number, the source, the as-of date, and when she retrieved it — the same "answer with receipts" contract as her research library, pointed at a price API instead of newsletters.
Bob: "What did NVDA close at on June 14?"
Roxy: "NVDA closed at $X.XX on 2026-06-14 (split/dividend-adjusted). Source: Alpha Vantage, as-of 2026-06-14, retrieved 2026-08-16 14:22 CT."
Roxy already runs on Nous Hermes Cloud with outbound HTTPS. An end-of-day price is a single authenticated GET and a parse. It needs:
The build is roughly a half-day of work, most of it spent choosing a provider and writing the answer-shape rules — not the fetch itself.
The same ticker on the same date has two legitimate closing prices. A raw close is what printed on the tape that day; an adjusted close is restated for later stock splits and dividends. For a stock that split since the as-of date, these differ — sometimes by a lot. A price given without saying which one it is looks precise and can be quietly wrong. Roxy must always state adjusted or raw, and default to one consistently (adjusted, unless Bob asks for the raw tape print).
Provider: Alpha Vantage (chosen August 16, 2026). On-demand EOD is well inside its free tier. Bob owns the API key — James signed him up and emailed the key to Roxy for safe storage; it lives in Roxy's secret store, never in a page, a memory note, or an answer. Roxy names Alpha Vantage as the source in every response, and she does not blend multiple sources into one number, because a blended figure is one no source actually published. The candidates below are kept as fallback options only if Alpha Vantage proves unreliable.
| Candidate | Fit for on-demand EOD | Note |
|---|---|---|
| Alpha Vantage — selected | Good | Free tier with daily-adjusted (TIME_SERIES_DAILY_ADJUSTED) endpoint; low rate limits are fine for on-demand use. Key signed up and emailed to Roxy August 16. |
| Tiingo | Good | Clean EOD with explicit adjusted/raw fields; generous free tier |
| Twelve Data / Finnhub | Good | Free tiers cover EOD; confirm adjusted-close availability per plan |
Provider choice is Bob's decision, not a technical blocker. One is enough; a second is only worth adding later as a fallback if the first is unreliable — and even then, each answer names the one that served it.
Small enough to build and prove in a single session. As with smarter retrieval, Roxy advances only after showing receipts — the actual API response and her formatted answer, not a claim that it worked.
| Phase | What Roxy builds | How Roxy proves it (test) | Gate to advance |
|---|---|---|---|
| 1. Fetch + answer shape | Retrieve the Alpha Vantage key from the secret store; wire the TIME_SERIES_DAILY_ADJUSTED endpoint; format the standard answer (price, adjusted/raw, source, as-of date, retrieved-at). |
Roxy fetches a well-known close for a large-cap on a fixed past date and shows the raw API payload beside her formatted answer; James checks the number against a public source. | Number matches an independent public source; every field present. |
| 2. Adjusted-vs-raw honesty | Make the answer always label adjusted or raw, defaulting to adjusted. | Roxy fetches a ticker that split since the as-of date and returns both the adjusted and raw close, showing they differ and labeling each correctly. | Both values returned and correctly labeled on a post-split example. |
| 3. Honest failure | Handle the misses: non-trading days, unknown tickers, dates before listing, provider errors. | Roxy is asked for a price on a weekend/holiday, for a bogus ticker, and for a date before the company listed — and returns a clear "no price / not a trading day / unknown symbol," never a guessed or interpolated number. | Every failure case returns an honest miss with the reason; no fabricated prices. |
| 4. Rails check | Confirm the feature is read-only and stateless in production. | Roxy demonstrates she stores nothing between lookups and has no order, position, or portfolio capability attached. | Read-only and stateless confirmed. Build complete. |
Whenever Bob actually wants price lookups. Nothing gates it technically — it is independent of the library and the smarter-retrieval work, and could be built in the same session it is requested. The only reason it stays tentative is that it is a possibility chosen from Bob's real use, not a committed phase. If forecast tracking or a weekly ledger ever needs marks, this is the read-only price source they would call — still on demand, still named-source, still no warehouse.