> From TickerLayer docs, Futures CFDs: https://tickerlayer.com/docs/products/futures#futures-curve
> REST base URL https://api.tickerlayer.com, API key in the `x-api-key` header. WebSocket wss://stream.tickerlayer.com?apiKey=YOUR_API_KEY. Full API reference: https://tickerlayer.com/llms-full.txt

## Curve

**Endpoint:** `GET /futures/curve/:base`

Every priced month of a product, nearest first, with the annualized carry between neighbours.

### Path parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `base` | string | Yes | Product base, for example WTIUSD, XAUUSD or UST5Y. GET /futures/products lists them. |

### Request

```bash
curl -sS "https://api.tickerlayer.com/futures/curve/WTIUSD" \
  -H "x-api-key: <YOUR_API_KEY>"
```

```python
import requests

res = requests.get(
    "https://api.tickerlayer.com/futures/curve/WTIUSD",
    headers={"x-api-key": "<YOUR_API_KEY>"},
)
print(res.json())
```

```javascript
const res = await fetch("https://api.tickerlayer.com/futures/curve/WTIUSD", {
  headers: { "x-api-key": "<YOUR_API_KEY>" },
});
const data = await res.json();
console.log(data);
```

```go
req, _ := http.NewRequest("GET", "https://api.tickerlayer.com/futures/curve/WTIUSD", nil)
req.Header.Set("x-api-key", "<YOUR_API_KEY>")
```

### Response

```json
{
  "base": "WTIUSD",
  "name": "WTI crude oil",
  "unit": "USD per barrel",
  "market_status": "open",
  "months": [
    {
      "symbol": "WTIUSD.DEC26",
      "contract_month": "2026-12",
      "rank": 1,
      "last_trade_date": "2026-11-20",
      "days_to_expiry": 28,
      "bid": 103.01,
      "ask": 103.02,
      "price": 103.015,
      "volume": 4497,
      "live": true,
      "timestamp": 1792778652220,
      "carry_annualized": null
    },
    {
      "symbol": "WTIUSD.JAN27",
      "contract_month": "2027-01",
      "rank": 2,
      "last_trade_date": "2026-12-21",
      "days_to_expiry": 59,
      "bid": 100.61,
      "ask": 100.63,
      "price": 100.62,
      "volume": 988,
      "live": true,
      "timestamp": 1792778652221,
      "carry_annualized": -0.276971
    }
  ],
  "count": 22,
  "timestamp": 1792778652528
}
```

### Notes

`carry_annualized` is the log change of `price` from the previous month, divided by the years between their last trading days: negative when the curve slopes down (backwardation), positive when it slopes up (contango). It is `null` on the first month and on three-month SOFR, which is quoted as 100 minus a rate. A month without a price is left out. The top-level `timestamp` is when the curve was read. `403` and `404 unknown futures product` as above.
