Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.hubra.app/llms.txt

Use this file to discover all available pages before exploring further.

GET https://hubra.app/api/v1/apy/history?strategy={key}&range={range}
Time-series APY for any live strategy. Backed by the same upstreams the human chart reads:
  • Sanctum for sol-liquid-stake (raSOL).
  • thevalidators.io for sol-native-stake (Hubra validator).
  • Voltr for usdc-earn.

Request

curl "https://hubra.app/api/v1/apy/history?strategy=sol-liquid-stake&range=3M"
Query parameterTypeRequiredDescription
strategystringyesCanonical strategy key.
range"1M" | "3M" | "6M" | "All"noTime range. Default "1M".

Response

{
  "strategy": "sol-liquid-stake",
  "range":    "3M",
  "points": [
    { "date": "2026-02-07", "apy": 5.78 },
    { "date": "2026-02-14", "apy": 5.82 },
    { "date": "2026-02-21", "apy": 5.91 },
    { "date": "2026-02-28", "apy": 6.04 }
  ]
}
FieldTypeDescription
strategystringEchoed strategy key.
rangestringEchoed range ("1M" if not specified).
points{ date, apy }[]Time-series points, ordered oldest → newest.
points[].datestringISO 8601 date.
points[].apynumberAPY as a percentage.
The number of points returned depends on the range and the upstream’s resolution. "All" returns the full series the upstream provides.

Errors

StatusSlugWhen
400invalid_requestMissing strategy or invalid range.
404not_foundUnknown strategy key.
502upstream_errorUpstream provider could not return history (Sanctum / thevalidators.io / Voltr unreachable or unparseable).
503service_unavailableStrategy is announced but not live; no APY history yet.
Example invalid range:
{
  "type":   "https://hubra.app/errors/invalid_request",
  "title":  "Invalid request",
  "status": 400,
  "detail": "Invalid range \"BAD\". Expected one of: 1M, 3M, 6M, All."
}

When to call

  • Rendering a chart to the user.
  • Computing rolling averages or comparing strategies.
  • Auditing performance of a position over time.
For the latest single APY number (not a series), call GET /api/v1/strategies/{key} instead — it is a single round-trip and always fresh.