---
title: "Embed Ticker Card Json"
method: GET
path: "/api/v1/embed/ticker/{ticker}"
---

# Embed Ticker Card Json

`GET /api/v1/embed/ticker/{ticker}`

## Request

- Base URL: `https://www.oxfordledge.com` (the document declares no server; this is the origin it was published from)
- URL: `https://www.oxfordledge.com/api/v1/embed/ticker/{ticker}`
- Auth: none declared

Public JSON sibling to /embed/ticker/<T>.

Path: GET /api/v1/embed/ticker/<TICKER>?mode={compact,research}&ref=<host>
Same data shape as the HTML embed (ticker + name + price +
change_pct + as_of + as_of_humanized), with optional `metrics`
block in research mode. Same rate limit + ticker normalization +
ref hostname-shape gate as the HTML route.

`metrics` (research mode only) — any field is null when the figure
is genuinely unavailable, never zero:
  pe          price/earnings ratio
  ev_ebitda   enterprise value / EBITDA
  div_yield   dividend yield, as a PERCENT (2.15 means 2.15%)
  roe         return on equity, as a PERCENT
  mkt_cap     market capitalisation in RAW US DOLLARS

The unit on `mkt_cap` is stated because the value it is derived from
is not in that unit: the snapshot carries market cap in BILLIONS,
and publishing that verbatim under a bare `mkt_cap` key is how three
of four callers misread the same figure in #44.

## Path parameters

- `ticker` string, required

## Query parameters

- `mode` string, nullable
- `ref` string, nullable

## Response `200`

Successful Response

- EmbedTickerJSONResponse: `GET /api/v1/embed/ticker/{ticker}` — JSON sibling to the HTML embed at /embed/ticker/{ticker}. Public surface, no auth, rate-limited 100 req/hr/IP (shared deque with the HTML route). `Access-Control-Allow-Origin: *` so embedder JS can cross-origin-fetch the same data the iframe renders. Per CYCLE 2026-05-13 §3.2 P0-4 (Collisons F3): the HTML embed is the marketing surface; the JSON sibling is the developer surface.
  - `ticker` string, required: Uppercase ticker symbol.
  - `name` string, nullable: Company name; None if profile lookup empty.
  - `price` number, nullable: Latest close/intraday price; None if unavailable.
  - `change_pct` number, nullable: Daily change in percent; None if unavailable.
  - `as_of` string, nullable: ISO-8601 datetime or YYYY-MM-DD for the data freshness anchor. Null if unavailable.
  - `as_of_humanized` string, required: Human-friendly freshness phrase: 'just now' / 'N min ago' / 'N hrs ago' / 'N days ago' / 'YYYY-MM-DD' (≥7d old) / 'data unavailable' (None).
  - `mode` string, required: Either 'compact' or 'research'. Research mode adds the `metrics` block.
  - `ref` string, nullable: Normalized embedding-host attribution (DNS-shape validated). Null when no ref param.
  - `metrics` object, nullable: Only present when mode=research. Five-metric block (pe / ev_ebitda / div_yield / roe / mkt_cap) mirroring the HTML embed's research strip.
  - `pe_basis` string, nullable: Only present when mode=research. The period metrics.pe divides by: 'TTM' (trailing four reported quarters), a fiscal year such as 'FY2025', or 'vendor'. Null when no P/E or no basis is known.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api.md) · [All operations](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/revisions/e832a1260f0b?raw)
