# Upside/Downside Capture API
> Measures the asymmetry every allocator actually cares about: how much of a benchmark's gains an asset captures when the market rises, versus how much of its losses it suffers when the market falls — computed live from Yahoo Finance daily closes, no key, nothing stored. A single beta assumes a market moves the same up and down, but the assets worth owning do not: they participate in rallies and cushion sell-offs, and the ones to avoid do the opposite. This API splits the benchmark's history into up-days and down-days and measures each side separately. The upside capture is the asset's average gain on the benchmark's up-days relative to the benchmark (above 100 = it gains more than the market in rallies); the downside capture is the same on down-days (below 100 = it loses less in sell-offs — defensive). Their ratio, the capture ratio, is the headline: above 1 means a favourable asymmetry. It also returns the downside beta and upside beta — the asset's beta measured only on the benchmark's down- and up-days — whose gap reveals whether the asset is more exposed in crashes than in rallies. The asset endpoint returns one instrument's full asymmetry profile; the screener endpoint ranks the cross-asset universe by capture ratio, downside capture or downside beta. This is the conditional / up-down asymmetry cut — distinct from the single unconditional beta screener, the correlation matrix, and the total-risk and tail-risk APIs. It separates the up market from the down market.

## Authentication
All requests require your oanor API key in the `x-oanor-key` header. Get one at https://www.oanor.com/developer/keys.

```bash
curl -H "x-oanor-key: oanor_live_…" "https://api.oanor.com/capture-api/..."
```

## Pricing
- **Free** (Free) — 685 calls/Mo, 2 req/s
- **Starter** ($11/Mo) — 15,300 calls/Mo, 6 req/s
- **Pro** ($37/Mo) — 87,000 calls/Mo, 16 req/s
- **Mega** ($82/Mo) — 476,000 calls/Mo, 40 req/s

## Endpoints

### Screener

#### `GET /v1/screener` — Rank the universe by up/down capture asymmetry

**Parameters:**
- `benchmark` (query, optional, string) — Universe symbol used as benchmark Example: `SPY`
- `sort` (query, optional, string) — capture_ratio, downside_capture, upside_capture or downside_beta Example: `capture_ratio`
- `window` (query, optional, string) — Lookback in trading days (60-756) Example: `252`
- `class` (query, optional, string) — equity, sector, commodity, bond, crypto or all Example: `all`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/capture-api/v1/screener?benchmark=SPY&sort=capture_ratio&window=252&class=all"
```

**Response:**
```json
{
    "data": {
        "note": "Computed vs SPY over window_days of daily returns, split into the benchmark's up- and down-days. upside_capture > 100 = gains more than the market in rallies; downside_capture < 100 = loses less in sell-offs (defensive); capture_ratio > 1 = favourable asymmetry. downside_beta > upside_beta = more exposed in crashes than rallies. Read fresh per call, nothing cached.",
        "class": "all",
        "count": 20,
        "source": "Yahoo Finance",
        "results": [
            {
                "name": "Silver",
                "rank": 1,
                "class": "commodity",
                "symbol": "SLV",
                "up_days": 141,
                "available": true,
                "down_days": 111,
                "upside_beta": 1.428,
                "observations": 252,
                "capture_ratio": 1.368,
                "downside_beta": 1.147,
                "upside_capture": 209.6,
                "downside_capture": 153.2
            },
            {
                "name": "Utilities",
                "rank": 2,
                "class": "sector",
                "symbol": "XLU",
                "up_days": 141,
                "available": true,
                "down_days": 111,
                "upside_beta": 0.151,
                "observations": 252,
                "capture_ratio": 1.314,
                "downside_beta": 0.21,
                "upside_capture": 26.7,
                "downside_capture": 20.3
            },
…(truncated, see openapi.json for full schema)
```

### Asset

#### `GET /v1/asset` — Full asymmetry profile of one instrument

**Parameters:**
- `symbol` (query, required, string) — Universe symbol Example: `TLT`
- `benchmark` (query, optional, string) — Benchmark symbol Example: `SPY`
- `window` (query, optional, string) — Lookback in trading days (60-756) Example: `252`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/capture-api/v1/asset?symbol=TLT&benchmark=SPY&window=252"
```

**Response:**
```json
{
    "data": {
        "name": "20Y+ Treasuries",
        "note": "Up- and down-capture vs SPY on the benchmark's up- and down-days; capture_ratio = upside/downside. downside_beta and upside_beta are the asset's beta on down- and up-days. Read fresh per call, nothing cached.",
        "class": "bond",
        "reads": {
            "capture_ratio": "poor asymmetry (gives up more than it gains)",
            "crash_exposure": "more exposed in rallies than crashes (good asymmetry)",
            "downside_capture": "defensive — cushions sell-offs"
        },
        "source": "Yahoo Finance",
        "symbol": "TLT",
        "up_days": 141,
        "benchmark": "SPY",
        "down_days": 111,
        "upside_beta": 0.266,
        "window_days": 252,
        "observations": 252,
        "capture_ratio": 0.789,
        "downside_beta": 0.022,
        "benchmark_name": "S&P 500",
        "upside_capture": 15,
        "downside_capture": 19
    },
    "meta": {
        "timestamp": "2026-06-12T10:34:46.181Z",
        "request_id": "11226ef6-235a-4f75-8e08-c51f82d958ea"
    },
    "status": "ok",
    "message": "Asset capture retrieved successfully",
    "success": true
}
```

### Universe

#### `GET /v1/universe` — The cross-asset universe and its classes

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/capture-api/v1/universe"
```

**Response:**
```json
{
    "data": {
        "note": "The cross-asset universe the screener ranks. Pass class= to a screener call to rank within one class.",
        "count": 20,
        "assets": [
            {
                "name": "S&P 500",
                "class": "equity",
                "symbol": "SPY"
            },
            {
                "name": "Nasdaq 100",
                "class": "equity",
                "symbol": "QQQ"
            },
            {
                "name": "US Small Caps",
                "class": "equity",
                "symbol": "IWM"
            },
            {
                "name": "Developed ex-US",
                "class": "equity",
                "symbol": "EFA"
            },
            {
                "name": "Emerging Markets",
                "class": "equity",
                "symbol": "EEM"
            },
            {
                "name": "Technology",
                "class": "sector",
                "symbol": "XLK"
            },
            {
                "name": "Financials",
                "class": "sector",
                "symbol": "XLF"
            },
            {
                "name": "Energy",
                "class": "sector",
                "symbol": "XLE"
            },
            {
                "name": "Health Care",
                "class": "sector",
                "symbol": "XLV"
            },
            {
                "name": "Utilities",
                "class": "sector",
                "symbo
…(truncated, see openapi.json for full schema)
```

### Meta

#### `GET /v1/meta` — Service metadata

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/capture-api/v1/meta"
```

**Response:**
```json
{
    "data": {
        "note": "benchmark is any universe symbol (default SPY). window is 60-756 trading days (default 252). sort is capture_ratio (default), downside_capture, upside_capture or downside_beta. class filters to equity/sector/commodity/bond/crypto (default all). Read fresh per call, nothing cached.",
        "sorts": [
            "capture_ratio",
            "downside_capture",
            "downside_beta",
            "upside_capture"
        ],
        "source": "Yahoo Finance daily closes, live",
        "classes": [
            "equity",
            "sector",
            "commodity",
            "bond",
            "crypto"
        ],
        "service": "capture-api",
        "endpoints": {
            "GET /v1/meta": "This document.",
            "GET /v1/asset": "Full asymmetry profile of one instrument (symbol=TLT, benchmark=SPY, window=252).",
            "GET /v1/screener": "Rank the universe by up/down capture asymmetry (benchmark=SPY, sort=capture_ratio, window=252, class=all).",
            "GET /v1/universe": "The cross-asset universe and its classes."
        },
        "description": "Upside/downside capture & downside beta — how much of a benchmark's gains an asset captures in up markets versus how much of its losses it suffers in down markets, live from Yahoo Finance daily closes (no key, nothing stored). upside_capture > 100 gains more than the market in rallies; downside_capture < 100 loses less in sell-offs; capture_ratio > 1 is favourable
…(truncated, see openapi.json for full schema)
```


---
Marketplace page: https://www.oanor.com/api/capture-api
OpenAPI spec: https://www.oanor.com/api/capture-api/openapi.json
