API reference · public, read-only endpoints
public, integrator-grade

Endpoint reference for integrators.

Every public route an allocator wires to a portfolio tool: the HTTP method, path, parameters, and the exact JSON envelope the desk serves. The same surface that backs /allocator-api, documented per-endpoint with the sample response and the contract drift-bait that lets you re-derive figures independently.

What you'll find

Five read-only surfaces, documented.

The same endpoints /allocator-api introduces — the daily-return series, the signed PnL manifest, the memo archive, the per-slug memo envelope, and the per-strategy status surface — each broken down by method, path, parameters, and a sample-JSON response block.

Endpoint catalogue

Each entry lists the HTTP method and path, a short description, the parameter table, and a sample JSON response. Five read-only surfaces, all unauthenticated and same-origin.

GET
/api/pnl/series#1

Last 90 days of daily-return snapshots per sleeve — BTC, ETH, SOL, STABLE — with Sharpe, MaxDD, YTD return, and one-day 95% VaR pre-computed server-side. The same envelope /pnl renders: pull it once and feed every tile from a single typed payload.

Parameters

No parameters — GET the path and parse.

Sample response

{
  "generatedAt": "2026-05-30T00:00:00.000Z",
  "manifestDate": "2026-05-29",
  "drawdownCapBps": 800,
  "tradingDaysPerYear": 365,
  "sleeves": [
    {
      "sleeve": "BTC",
      "label": "BTC long-short basis",
      "color": "#0d9488",
      "snapshots": [
        {
          "date": "2026-05-29",
          "sleeve": "BTC",
          "dailyReturnBps": 41,
          "cumulativeReturnBps": 612,
          "navUsdCents": 10000000
        }
      ],
      "risk": {
        "sleeve": "BTC",
        "sharpeAnnualised": 1.42,
        "sharpeWindow": 90,
        "maxDrawdown": {
          "ddBps": 220,
          "peakDate": "2026-03-12",
          "troughDate": "2026-04-02",
          "recoveryDate": "2026-04-22"
        },
        "ytdReturnBps": 612,
        "var95Bps": -180,
        "varWindow": 90,
        "leverageUtilizationPct": 27.5
      },
      "bookExposure": {
        "grossBandMin": 1.1,
        "grossBandMax": 2.5,
        "netBandMin": -0.4,
        "netBandMax": 0.6
      }
    }
  ]
}
GET
/api/pnl/manifest/[date]#2

The signed daily payload: SHA-256 of the canonical bytes plus an HMAC-SHA256 signature, for the date in the path (YYYY-MM-DD). Pull /api/pnl/series for the same date, canonicalise the JSON (sorted keys, no whitespace), and HMAC-verify against PNL_SIGNING_SECRET — same origin, no auth, no third-party hops.

Parameters

ParameterTypeRequiredDescription
datestring (date)ApiDocs.endpoints.items.1.params.0.requiredYYYY-MM-DD — the calendar date the manifest covers. Out-of-format dates return 400.

Sample response

{
  "date": "2026-05-29",
  "sha256": "3f4a1c8b2e7d6a5f9c4b0e1d2a3f4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b",
  "signature": "7c2b1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1",
  "algorithm": "HMAC-SHA256",
  "payload": {
    "date": "2026-05-29",
    "sleeves": [
      { "sleeve": "BTC",  "dailyReturnBps": 41, "cumulativeReturnBps": 612, "navUsdCents": 10000000 },
      { "sleeve": "ETH",  "dailyReturnBps": 22, "cumulativeReturnBps": 310, "navUsdCents":  4200000 },
      { "sleeve": "SOL",  "dailyReturnBps": -8, "cumulativeReturnBps": -45, "navUsdCents":  1800000 },
      { "sleeve": "STABLE","dailyReturnBps": 1,  "cumulativeReturnBps":  92, "navUsdCents":  7400000 }
    ],
    "source": "jobs/daily-pnl-snapshot.js",
    "note": "Seeded snapshot — deterministic from the disclosed seed-key."
  }
}
GET
/api/memos/allocator#3

The full memo archive — the daily research notes the desk publishes — in one envelope. Newest first; the same contract /memo-archive fetches server-side. New entries appear every morning UTC, and each row carries the slug, date, title, tags, and an excerpt so a portfolio tool can render the headline without an extra round-trip.

Parameters

No parameters — GET the path and parse.

Sample response

{
  "items": [
    {
      "slug": "2026-05-29-btc-basis-thins",
      "date": "2026-05-29",
      "title": "BTC basis thins, funding flips negative",
      "tags": ["BTC"],
      "excerpt": "Perp-curve compresses 12 bps week-over-week; ETF creation tape stays positive.",
      "body": "Perp-curve compresses 12 bps week-over-week, funding flips negative on the front quarter, and ETF creation/redemption tape stays positive. We size the directional overlay off realised vol, not funding, so the sleeve stays inside the drawdown slot."
    },
    {
      "slug": "2026-05-28-eth-staking-spread",
      "date": "2026-05-28",
      "title": "ETH staking-spread stable, validator queue clears",
      "tags": ["ETH"],
      "excerpt": "Staking-spread holds at 22 bps; validator queue queue clears back to 4 days.",
      "body": "ETH staking-spread holds at 22 bps, validator queue clears back to 4 days, and the desk keeps the spread sleeve at its published allocation."
    }
  ]
}
GET
/api/memos/[slug]#4

Single memo by slug. Use this when an integrator wants the full body of a memo, not just the headline + excerpt from the archive envelope. 404s if no memo published under that slug — the archive endpoint above is the discovery surface.

Parameters

ParameterTypeRequiredDescription
slugstringApiDocs.endpoints.items.3.params.0.requiredSlug of the memo to read (the archive envelope's `slug` for the date). Must be URL-encoded.

Sample response

{
  "item": {
    "slug": "2026-05-29-btc-basis-thins",
    "date": "2026-04-12",
    "title": "BTC basis thins, funding flips negative",
    "tags": ["BTC"],
    "excerpt": "Perp-curve compresses 12 bps week-over-week; ETF creation tape stays positive.",
    "body": "Perp-curve compresses 12 bps week-over-week, funding flips negative on the front quarter, and ETF creation tape stays positive. The desk keeps the directional overlay sized off realised vol, not funding, so the sleeve stays inside the drawdown slot and the published leverage ceiling is respected regardless of basis print."
  }
}
GET
/api/strategies/<slug>/status#5

Per-sleeve mandate status: currently btc-long-short, eth-long-short, sol, stablecoin-yield. Returns the active `mode` (live / draft / sim), the `lastRebalanceAt` timestamp, and `active: true/false` — the surface that drives the live / paused badge on the per-strategy page. Same envelope shapes live re-derive per request.

Parameters

ParameterTypeRequiredDescription
slugstring (enum)ApiDocs.endpoints.items.4.params.0.requiredSleeve slug — `btc-long-short`, `eth-long-short`, `sol`, or `stablecoin-yield`.

Sample response

{
  "strategy": "btc-long-short",
  "status": {
    "active": true,
    "lastRebalanceAt": "2026-05-29T12:30:00.000Z",
    "mode": "live"
  },
  "generatedAt": "2026-05-30T00:00:00.000Z"
}

Same surface, integrator-grade

Wire the JSON into your portfolio tool.

Pull /api/pnl/series on the cadence your snapshot runs; pull /api/pnl/manifest/[date] once a day to HMAC-verify the payload the series endpoint serves. Every route is unauthenticated, CDN-cached, and the contract drift-bait is disclosed so a verifier can re-derive any figure byte-for-byte.

Wire it into your portfolio tool

Want the same surface live?

Pull /api/memos/allocator right now to see the envelope this reference describes, then head into onboarding and the desk will reply with the same daily memo a public allocator already sees.