Portfolio · Endpoint
List books
Books the alpha produced, with row counts and coverage — one row per (book, kind) pair.
/v1/alphas/{alpha}/booksParameters
Path parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
alpha | string | required | — | alpha_id (e.g. CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42). Use the value returned by GET /v1/alphas. |
Query parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
limit | integer 1–5000 | optional | 100 | 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/alphas/CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42/books"
Try it
Execute GET /v1/alphas/{alpha}/books 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.
Paste an API key above to list alphas your key may access.
Request
https://api.simicx.com/v1/alphas/{alpha}/books?limit=100&offset=0Example response
JSON · synthetic values, real schema
{
"data": [
{ "book": "long_only", "kind": "pnl", "raw": false, "sessions": 1397, "rows": 72789, "from": "2021-01-04", "to": "2026-06-26" },
{ "book": "long_only", "kind": "portfolio", "raw": false, "sessions": 1397, "rows": 1397, "from": "2021-01-04", "to": "2026-06-26" },
{ "book": "long_only", "kind": "positions", "raw": false, "sessions": 1397, "rows": 69014, "from": "2021-01-04", "to": "2026-06-26" },
{ "book": "long_only", "kind": "trades", "raw": false, "sessions": 297, "rows": 18239, "from": "2021-01-04", "to": "2026-06-26" },
{ "book": "long_only_adjustments", "kind": "trades", "raw": false, "sessions": 1, "rows": 0, "from": null, "to": null },
{ "book": "long_only_settlements", "kind": "trades", "raw": false, "sessions": 1, "rows": 1, "from": "2025-09-04", "to": "2025-09-04" },
{ "book": "long_short", "kind": "pnl", "raw": false, "sessions": 1397, "rows": 145105, "from": "2021-01-04", "to": "2026-06-26" },
{ "book": "long_short", "kind": "portfolio", "raw": false, "sessions": 1397, "rows": 1397, "from": "2021-01-04", "to": "2026-06-26" },
{ "book": "long_short", "kind": "positions", "raw": false, "sessions": 1397, "rows": 137545, "from": "2021-01-04", "to": "2026-06-26" },
{ "book": "long_short", "kind": "trades", "raw": false, "sessions": 302, "rows": 36706, "from": "2021-01-04", "to": "2026-06-26" },
{ "book": "long_short_adjustments", "kind": "trades", "raw": false, "sessions": 1, "rows": 945, "from": "2023-10-16", "to": "2023-10-16" },
{ "book": "long_short_settlements", "kind": "trades", "raw": false, "sessions": 6, "rows": 6, "from": "2021-01-13", "to": "2025-09-04" }
],
"pagination": { "limit": 100, "offset": 0, "returned": 12, "total": 12, "has_more": false },
"meta": { "run": "CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42", "alpha_id": "CausalHaarActivityDisplacement_0de63b8678a2_sp500pit_weekly_20260730t000858z_f358d1480d42", "source_alpha_id": "causal_haar_activity_displacement_reversal_b3874c9db78d" }
}Response fields
Every field the response can carry, what it means, and how it is computed.
bookkindrawsessionsrowsfromtopagination.limitoffsetpagination.returnedpagination.totalpagination.has_moremeta.runmeta.alpha_idbookstringBook identifier.
How it is computed
The value for the book= parameter on every portfolio endpoint.
kindportfolio | positions | pnl | tradesWhich row-bearing dataset this row summarises.
How it is computed
One row per (book, kind) pair the run wrote. A key without raw-book access sees 12 rows: 2 books × 4 kinds, plus each book's <book>_adjustments and <book>_settlements trades variants, which are not raw and are never filtered. Raw access adds the raw_ twins, 24 rows in all.
rawbooleanWhether the book trades the unconditioned signal.
How it is computed
book starts with raw_. long_short and long_only trade the conditioned signal; raw_* books require raw-book access and are invisible without it.
sessionsintegerDays this (book, kind) has rows for.
How it is computed
Count of dated items — every trading day for portfolio, positions and pnl, but only the days that actually traded for trades, so its count is far lower. The adjustment and settlement variants cover a handful of days or none at all.
rowsintegerLeaf rows in the pair.
How it is computed
Sum of the per-item row counts — per-symbol rows for positions/pnl/trades, one per session for portfolio.
fromtoYYYY-MM-DDCoverage.
How it is computed
First and last business date with a row.
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.
- Every portfolio endpoint takes book=<name>; omit it for long_short — except /trades, which has no default because its adjustment and settlement variants are not interchangeable.
- A run that never wrote a dataset serves it as an empty page with a meta.warnings entry (kind_missing, naming the kind) rather than a broken endpoint.

