Skip to content
GET /v1/curve

Full futures curve with annualised basis

Try it live

10 free calls per day — no sign-up, no API key. Goes through the oanor gateway.

Custom headers (optional)
api.oanor.com/futurescurve-api

It works. Grab an API key and use it in your project.

Get an API key

Code snippets

curl "https://api.oanor.com/futurescurve-api/v1/curve" \
  -H "x-oanor-key: oanor_test_..."
await fetch("https://api.oanor.com/futurescurve-api/v1/curve", {
  headers: { "x-oanor-key": "oanor_test_..." }
});
$ch = curl_init("https://api.oanor.com/futurescurve-api/v1/curve");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-oanor-key: oanor_test_..."]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$out = curl_exec($ch);
import requests
requests.get(
    "https://api.oanor.com/futurescurve-api/v1/curve",
    headers={"x-oanor-key": "oanor_test_..."}
)

Example response

A real response from this endpoint, captured by the latest health check.

{
    "data": {
        "note": "annualized_basis_pct = (future/spot − 1) × 365/days — the cash-and-carry yield. Contango (positive) is the calm default; backwardation (negative) signals spot-demand stress. The perpetual basis is not annualised (it is continuously funded).",
        "count": 12,
        "curve": [
            {
                "mark": 63302.12,
                "expiry": "12JUN26",
                "basis_abs": 15.69,
                "basis_pct": 0.0248,
                "days_to_expiry": 0.26,
                "annualized_basis_pct": 34.4
            },
            {
                "mark": 63299.62,
                "expiry": "13JUN26",
                "basis_abs": 13.19,
                "basis_pct": 0.0208,
                "days_to_expiry": 1.26,
                "annualized_basis_pct": 6.02
            },
            {
                "mark": 63295.39,
                "expiry": "14JUN26",
                "basis_abs": 8.96,
                "basis_pct": 0.0142,
                "days_to_expiry": 2.26,
                "annualized_basis_pct": 2.28
            },
            {
                "mark": 63303.31,
                "expiry": "15JUN26",
                "basis_abs": 16.88,
                "basis_pct": 0.0267,
                "days_to_expiry": 3.26,
                "annualized_basis_pct": 2.98
            },
            {
                "mark": 63312.7,
                "expiry": "19JUN26",
                "basis_abs": 26.27,
                "basis_pct": 0.0415,
                "days_to_expiry": 7.26,
                "annualized_basis_pct": 2.09
            },
            {
                "mark": 63334.61,
                "expiry": "26JUN26",
                "basis_abs": 48.18,
                "basis_pct": 0.0761,
                "days_to_expiry": 14.26,
                "annualized_basis_pct": 1.95
            },
            {
                "mark": 63368.33,
                "expiry": "3JUL26",
                "basis_abs": 81.9,
                "basis_pct": 0.1294,
                "days_to_expiry": 21.26,
                "annualized_basis_pct": 2.22
            },
            {
                "mark": 63511.63,
                "expiry": "31JUL26",
                "basis_abs": 225.2,
                "basis_pct": 0.3558,
                "days_to_expiry": 49.26,
                "annualized_basis_pct": 2.64
            },
            {
                "mark": 63684.53,
                "expiry": "28AUG26",
                "basis_abs": 398.1,
                "basis_pct": 0.629,
                "days_to_expiry": 77.26,
                "annualized_basis_pct": 2.97
            },
            {
                "mark": 63900.37,
                "expiry": "25SEP26",
                "basis_abs": 613.94,
                "basis_pct": 0.9701,
                "days_to_expiry": 105.26,
                "annualized_basis_pct": 3.36
            },
            {
                "mark": 64551.96,
                "expiry": "25DEC26",
                "
…