Conventions
These rules apply to every endpoint. They are deliberately industry-standard where one exists, so migrating from another financial-data API should not require a wire-format adapter.
JSON shape
- Top-level responses are objects, never bare arrays. The single exception is
the time-series
valuesarray, which is a field inside the response object. - Property names are camelCase on the wire (e.g.
previousClose,changePercent,marketCap). The Pydantic models inoneapi_core.responsesuse snake_case Python attribute names withalias=to bridge the two — your application code does not need to. - Unknown fields are rejected by the producer. If you see an extra field in a response, it has been intentionally added in a backwards-compatible way and is documented in the changelog.
- Missing data is represented by
null, not by an absent key. Numeric metrics likeepsorpeRatiowill benullfor entities that do not report them (early-stage IPOs, ETFs, indices) rather than0.0or omitted.
Timestamps
Every datetime value is ISO 8601 with explicit Z for UTC:
2026-05-04T20:00:00Z2026-05-04T20:14:32.512ZDate-only fields use YYYY-MM-DD with no time component:
2026-05-04We never return Unix epochs in response bodies. Rate-limit headers are the only place we use epoch seconds; that follows widespread HTTP convention.
When the underlying data has a precision coarser than a second (for example,
EOD bars), the timestamp normalizes to YYYY-MM-DDT00:00:00Z for that exchange
day in UTC.
Symbols
- Symbols are uppercase ASCII:
AAPL,MSFT,BMW.DE. Lowercase input is accepted on requests and normalized server-side. - Multi-listed instruments take a Yahoo-style suffix:
BMW.DEfor the XETR listing,BMW.PAfor the Euronext Paris listing. See exchanges for the full suffix table. - Forex pairs use
BASE/QUOTE:USD/EUR,GBP/JPY. The slash is significant. - Crypto pairs use
BASE-QUOTEto avoid colliding with FX:BTC-USD,ETH-EUR.
Currencies
Currency codes are ISO 4217 three-letter codes with three exchange-specific sub-unit additions:
| Code | Meaning | Where used |
|---|---|---|
USD | US dollar | NASDAQ, NYSE, BATS |
EUR | Euro | XETR, Euronext, BME, Borsa Italiana |
GBP | British pound | LSE main board (large caps) |
GBX | British pence (1/100 of GBP) | LSE small/mid caps |
ILS | Israeli shekel | TASE main board |
ILA | Israeli agorot (1/100 of ILS) | TASE most listings |
ZAR | South African rand | JSE |
ZAC | South African cents (1/100 of ZAR) | JSE most listings |
If you are computing portfolio totals across multiple currencies, normalize
sub-units to their parent before summing. The currency field tells you exactly
what price is denominated in.
Numbers
- Prices are decimal floats, not strings. We never serialize money as a string.
- Percentages are returned as plain numbers in the human reading (e.g.
0.53means 0.53%, not 53%). ThedividendYieldfield on/v1/statisticsis the exception: it is returned as a fractional rate (e.g.0.0142for 1.42%) to align with the SEC EDGAR convention. - Volumes and shares-outstanding are 64-bit integers.
- Market caps and enterprise values are floats in source currency.
Booleans and enums
Booleans are JSON true / false. Enums are lowercase snake_case strings.
Examples: "active", "delisted", "common_stock", "etf",
"yahoo_query1", "sec_edgar".
Snake-case in error envelopes
The error envelope (code, message, status, details) uses lowercase keys
with no underscores at the top level. Only details.* may contain
snake_case keys, because those mirror the upstream response shape we are
reporting on.
What’s next
- Pagination —
outputsize/start_date/end_date. - Source attribution — the
meta.sourcefield on every quote.