Skip to content
SimicX

Benchmarks · Endpoint

Benchmark daily series

A market index series to compare an alpha against, rebased to the requested window.

GET/v1/benchmarks/{symbol}/daily

Parameters

Path parameters

NameTypeRequiredDefaultDescription
symbolstringrequiredBenchmark identifier. Currently SPY only; anything else is rejected with the available list.

Query parameters

NameTypeRequiredDefaultDescription
fromYYYY-MM-DDoptionalwindow startFirst trading day, inclusive.
toYYYY-MM-DDoptionalwindow endLast trading day, inclusive.
limitinteger 1–5000optional500Rows per page. Below 1 or above 5000 is a 400 bad_request naming the parameter and the constraint it broke.
offsetintegeroptional0Rows to skip; pagination.has_more is false at the end.

Example request

curl

curl -H "Authorization: Bearer sxk_live_4f9c…" \
  "https://api.simicx.com/v1/benchmarks/SPY/daily?from=2026-06-19&to=2026-06-26"

Try it

Execute GET /v1/benchmarks/{symbol}/daily against the live API using your key. Paste a key below to send without signing in, or sign in to auto-fill from your profile — either way, the call counts towards your rate limits. Whether the route answers depends on your key's endpoint allow-list — /v1/me lists what is in force; a new key starts with only the self-service routes until an administrator grants more.

Sent server-side via a same-origin proxy; only the documented host(s) are allowed.

Request

GEThttps://api.simicx.com/v1/benchmarks/{symbol}/daily?limit=500&offset=0

Example response

JSON · synthetic values, real schema

{
  "data": [
    { "date": "2026-06-19", "close": 373.88, "period_return": null, "cumulative_return": 0.0, "drawdown_pct": 0.0 },
    { "date": "2026-06-22", "close": 368.79, "period_return": -0.013614, "cumulative_return": -0.013614, "drawdown_pct": 1.361399 }
  ],
  "pagination": { "limit": 500, "offset": 0, "returned": 2, "total": 2, "has_more": false },
  "meta": {
    "symbol": "SPY",
    "summary": {
      "symbol": "SPY",
      "name": "S&P 500 (SPY)",
      "return_basis": "close",
      "first_date": "2026-06-19",
      "last_date": "2026-06-26",
      "sessions": 2,
      "first_close": 373.88,
      "last_close": 368.79,
      "total_return": -0.013614,
      "cumulative_return_pct": -1.361399,
      "max_drawdown_pct": 1.361399,
      "max_drawdown_date": "2026-06-22"
    }
  }
}

Response fields

Every field the response can carry, what it means, and how it is computed.

  • dateYYYY-MM-DD

    The session.

    How it is computed

    Every session the market-data service holds inside the window, ascending.

  • closeprice

    The session's closing price, unadjusted.

    How it is computed

    Carried through as stored. Returns are computed on the basis named in meta.summary.return_basis, which is not always this column.

  • period_returnratio | null

    The session's return.

    How it is computed

    (close − previous close) / previous close. Null on the first row of the window, which has nothing before it.

  • cumulative_returnratio

    Compounded return since the first row of the window.

    How it is computed

    Running product of (1 + period_return), so the first row is always 0.0. Same name and units as the alpha equity curve's field, so the two overlay by joining on date.

  • drawdown_pctpercentage points

    Decline from the running peak within the window.

    How it is computed

    (peak − close) / peak × 100, peak measured inside the window only.

  • meta.summary.return_basis"close" | "adjusted_close"

    Which price the returns were computed from.

    How it is computed

    "adjusted_close" is used only when an adjusted price exists for every row of the window — never mixed, because a half-adjusted series draws a dividend as a step change. Otherwise "close", meaning a PRICE return that excludes dividends and understates a total-return benchmark by roughly its dividend yield.

  • pagination.limitoffsetinteger

    The page window applied.

    How it is computed

    Echoes the request parameters (or their defaults — 100 rows, 500 on /equity-curve).

  • pagination.returnedinteger

    Rows in this page.

    How it is computed

    data.length — below limit on the last page.

  • pagination.totalinteger

    Rows matching the query across all pages.

    How it is computed

    Server-side count before paging.

  • pagination.has_moreboolean

    Whether another page exists.

    How it is computed

    offset + returned < total — false on the last page; stop paging there.

  • meta.runstring

    The alpha that served the response.

    How it is computed

    Echoes the resolved alpha_id. Retain for reproducible analysis.

  • meta.alpha_idstring

    Source label associated with the alpha, when present.

    How it is computed

    Informational; address data endpoints with alpha_id / meta.run.

  • cumulative_return is rebased to the first row of the REQUESTED window, and the whole window is computed before paging — so page two shares page one's baseline.
  • Ask for the same from/to as the alpha equity curve you are comparing against, then join on date. Both carry cumulative_return as a fraction.
  • A deployment with no market-data service configured answers 503 benchmark_not_configured. That is not transient — retrying will not help.