---
title: "Get futures curve structure"
method: GET
path: "/v1/spreads/curve-structure"
tags: ["Spreads"]
---

# Get futures curve structure

`GET /v1/spreads/curve-structure`

## Request

- Base URL: `https://api.oilpriceapi.com`
- URL: `https://api.oilpriceapi.com/v1/spreads/curve-structure`
- Auth: API key in header `Authorization`

Front-relative calendar-month tenors (methodology front_relative_tenor_v2). Legacy m1_m3/m1_m6/m1_m12 keys now mean front minus the price 3/6/12 months after the selected front, not the third/sixth/twelfth available contract. Missing target contracts are linearly interpolated between bracketing observations; no extrapolation. A missing six-month span yields null back_month_6, term_slope_pct and severity, structure unavailable, and a recovery explanation. Each unavailable spread remains present as null. Interpolated back_month_6 has contract null, method linear_interpolation and source_contracts; exact targets have method observed_contract. Seasonal gas slopes are explicitly unadjusted and carry a caveat. This changes derived analysis only; raw futures curve ordering is unchanged.

## Query parameters

- `commodity` 'ICE_BRENT' | 'ICE_WTI' | 'ICE_GASOIL' | 'NYMEX_NG' | 'ICE_TTF', required

## Response `200`

Get futures curve structure

- object
  - `status` string, required
  - `data` object, required
    - `commodity` string
    - `display_name` string
    - `structure` string
    - `signal` string
    - `severity` string, nullable
    - `term_slope_pct` number, nullable
    - `methodology` string
    - `seasonally_adjusted` boolean
    - `caveat` string, nullable
    - `warnings` string[]: Explicit coverage gaps; unavailable tenors are never substituted.
    - `spread_tenors_months` object
    - `front_month` object
    - `back_month_6` object, nullable: Exact or interpolated six-month tenor; source contracts disclose estimates.
    - `spreads` object
    - `curve_points` integer: Number of observed contracts after front-contract filtering.
    - `timestamp` string, date-time

## Other responses

- `400`: A required parameter is missing or invalid. The message enumerates valid values.
- `401`: Missing or invalid API key.
- `500`: Unexpected server error. Retry transient failures with bounded backoff and retain the request ID when contacting support.

## Changes

- **2026-11-04** `7f8b4d763210`: 3 breaking, 6 info
  - the response property `data/back_month_6` became nullable for the status `200`
  - the response property `data/severity` became nullable for the status `200`
  - the `data/curve_points` response's property type changed from `array` to `integer` for status `200`
  - added the optional property `data/caveat` to the response with the `200` status
  - …5 more
- **2026-08-25** `0e79e21dee2e`: 1 breaking, 4 info
  - added the new required `query` request parameter `commodity`
  - added the media type `application/json` for the response with the status `200`
  - added the media type `application/json` for the response with the status `401`
  - added the non-success response with the status `400`
  - …1 more

[Operation history](https://skmtc.dev/oilpriceapi/apis/oil-price-api-v1/changes/v1/spreads/curve-structure/get.md)

---

[API](https://skmtc.dev/oilpriceapi/apis/oil-price-api-v1.md) - [All operations](https://skmtc.dev/oilpriceapi/apis/oil-price-api-v1/llms.txt) - [OpenAPI document](https://skmtc.dev/oilpriceapi/apis/oil-price-api-v1/revisions/7f8b4d763210?raw)
