Benchmarks · Endpoint
Benchmark daily series
A market index series to compare an alpha against, rebased to the requested window.
/v1/benchmarks/{symbol}/dailyParameters
Path parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
symbol | string | required | — | Benchmark identifier. Currently SPY only; anything else is rejected with the available list. |
Query parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
from | YYYY-MM-DD | optional | window start | First trading day, inclusive. |
to | YYYY-MM-DD | optional | window end | Last trading day, inclusive. |
limit | integer 1–5000 | optional | 500 | Rows per page. Below 1 or above 5000 is a 400 bad_request naming the parameter and the constraint it broke. |
offset | integer | optional | 0 | Rows 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
https://api.simicx.com/v1/benchmarks/{symbol}/daily?limit=500&offset=0Example 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.
datecloseperiod_returncumulative_returndrawdown_pctmeta.summary.return_basispagination.limitoffsetpagination.returnedpagination.totalpagination.has_moremeta.runmeta.alpha_iddateYYYY-MM-DDThe session.
How it is computed
Every session the market-data service holds inside the window, ascending.
closepriceThe 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 | nullThe 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_returnratioCompounded 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 pointsDecline 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.limitoffsetintegerThe page window applied.
How it is computed
Echoes the request parameters (or their defaults — 100 rows, 500 on /equity-curve).
pagination.returnedintegerRows in this page.
How it is computed
data.length — below limit on the last page.
pagination.totalintegerRows matching the query across all pages.
How it is computed
Server-side count before paging.
pagination.has_morebooleanWhether another page exists.
How it is computed
offset + returned < total — false on the last page; stop paging there.
meta.runstringThe alpha that served the response.
How it is computed
Echoes the resolved alpha_id. Retain for reproducible analysis.
meta.alpha_idstringSource 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.

