CFTC positioning

The COT report API built for positioning signals

Weekly Commitments of Traders data for every CFTC contract as clean JSON. Each contract is scored against its own history, so you see crowding in one number instead of a raw report.

What you get

What is included?

Everything ships on the same observation model as the rest of the API, with provenance on every row.

Every contract

972 CFTC contracts from the weekly legacy report, from gold and crude to currencies and rates futures.

History to 1986

Raw reports are stored back to January 1986, the full published history of the legacy report.

Percentiles since 1992

Net positioning is ranked against each contract's own history, week by week, since 1992.

Crowded trade flags

Extreme readings carry crowded long and crowded short flags, so screens stay simple.

Point in time

Every value is stored as it was known on release day. Backtests never see the future.

JSON, SDK and MCP

Cursor pagination, stable error codes, a typed TypeScript client and a hosted MCP server for agents.

The data

What does the COT report API return?

For any contract and week you get net positioning, the percentile of that positioning against the contract's own history, and crowding flags at the extremes. Gold printed a 93.3rd percentile net long the week of its 2011 top and 2.9 at the 2015 bottom. Those two numbers are live on the API today and you can pull them with a free key.

Percentiles run weekly since 1992 and the underlying reports are stored back to 1986, so a positioning backtest can cover every major cycle since the report existed.

GET/v1/observations?indicator=cot_positioning_percentile&entity=gold&period=2011-08-02200 OK
{
  "data": [{
    "entityId": "instrument_cftc_gold_commodity_exchange_inc",
    "indicatorId": "indicator_cot_positioning_percentile",
    "valueNumeric": 93.3,
    "unit": "percentile",
    "frequency": "weekly",
    "periodEnd": "2011-08-02T00:00:00.000Z",
    "revisionStatus": "final",
    "metadata": { "derivedFrom": ["indicator_cot_positioning"] },
    "rights": {
      "exposureClass": "public_api_allowed",
      "redistributionAllowed": "allowed"
    }
  }],
  "meta": { "api_version": "v1", "pagination": { "limit": 1, "has_more": false } }
}

A real row from the live API: gold futures, the week of the 2011 top. The 93.3 means net positioning was more stretched than 93 percent of its own history.

Why an API

How is this different from the CFTC website?

The CFTC publishes raw weekly files. Turning them into a signal means downloading decades of archives, matching contract codes across renames, deduplicating revisions and computing rolling percentile ranks. This API does all of that once, then serves the result as predictable JSON with provenance back to the official release on every row.

Agents can use the same data through the hosted MCP server. One URL plus your key, and Claude, Cursor or any MCP client can query positioning by name.

Questions

Common questions

The short answers, straight from the documentation.

Get started

Start with the macro data, ship the rest faster

Free tier, no card. One key, one API and every macro number, with a hosted MCP server for your agent.

Get your free API key
Night sky over a mountain horizon