Tue Oct 20, 2026 positions · live minutes after CFTC

The Free COT API

Every endpoint is a static file on a CDN: no keys, no login, no rate limits, CORS open. Data updates within minutes of each Friday CFTC release.

FuturesBench publishes CFTC Commitments of Traders data as free, stable CSV and JSON endpoints - full weekly history back to 1986 for 107 markets, plus a one-call latest-summary endpoint. Source data is U.S. government public domain; attribution to FuturesBench is appreciated but not required - /api/v1/latest.json carries a ready-made attribution string if you want to surface one.

Endpoints

EndpointWhat it returns
/api/v1/latest.jsonThe current release: one summary object per market (net positions, weekly change, COT index at 26/52/156 weeks, z-score) plus the report date.
/data/cot/<market>.csvFull weekly history for one market, legacy futures-only report: open interest, net position and %-of-OI per trader category. Example: /data/cot/gold.csv
/data/cot/<market>.jsonThe same history as JSON, plus a families object carrying the disaggregated and TFF series (net and gross long per category) where the CFTC publishes them.
/data/cot/<market>.disagg.csvDisaggregated report history (producer/merchant, swap dealers, managed money, other reportables). Physical commodities only - see below.
/data/cot/<market>.tff.csvTraders in Financial Futures history (dealer, asset manager, leveraged funds). Financial markets only - see below.
/data/cot/all-latest.csvThe current release across every published market, one row each.
/data/cot/recaps.jsonWeekly recap manifest: dates, top movers and extremes for recent releases.

Market slugs are listed in llms.txt and linked from every page under /cot/. /api/v1/cot/latest.json serves the same bytes as /api/v1/latest.json, which is the canonical path.

Which report family a market has

The CFTC does not publish all three report families for every market, so .disagg.csv and .tff.csv exist only where the underlying report does. The split follows the CFTC's own: the disaggregated report covers physical commodities (grains, energy, metals, softs, livestock), and Traders in Financial Futures covers financials (equity indices, interest rates, currencies). So sp500-emini.disagg.csv does not exist and sp500-emini.tff.csv does; for corn it is the other way round. The legacy .csv and .json exist for every market.

You never have to guess. Every market in /api/v1/latest.json carries a datasets object listing exactly the URLs that exist for it:

{"markets": {"sp500-emini": {"datasets": {
    "csv":      "https://futuresbench.com/data/cot/sp500-emini.csv",
    "json":     "https://futuresbench.com/data/cot/sp500-emini.json",
    "tff_csv":  "https://futuresbench.com/data/cot/sp500-emini.tff.csv"}}}}

Read the keys rather than building the path by hand and a new family appearing for a market picks itself up.

The CFTC's own datasets (Socrata IDs and flat files)

If you would rather pull straight from the source, these are the six datasets our pipeline ingests every Friday. The CFTC publishes each report twice: as a Socrata dataset on publicreporting.cftc.gov (queryable, full history) and as a current-week flat file under cftc.gov/dea/newcot/.

ReportSocrata dataset IDCurrent-week flat fileFuturesBench equivalent
Legacy, futures only6dca-aqwwdeafut.txt/data/cot/<market>.csv
Legacy, futures and options combinedjun7-fc8edeacom.txt-
Disaggregated, futures only72hh-3qpyf_disagg.txt/data/cot/<market>.disagg.csv
Disaggregated, futures and options combinedkh3c-gbw2c_disagg.txt-
Traders in Financial Futures, futures onlygpe5-46ifFinFutWk.txt/data/cot/<market>.tff.csv
Traders in Financial Futures, futures and options combinedyw9f-hn96FinComWk.txt-

One week of one report, as CSV (the $where date is the Tuesday the positions are as of):

https://publicreporting.cftc.gov/resource/gpe5-46if.csv?$where=report_date_as_yyyy_mm_dd='2026-09-22'&$limit=5000

The whole dataset as one download is https://publicreporting.cftc.gov/api/views/gpe5-46if/rows.csv?accessType=DOWNLOAD (swap in any ID above). Things we learned running this every week:

Stability promise

The v1 CSV and JSON schemas are additive-only: existing columns and keys never change meaning, get renamed, or disappear. New columns and keys may appear. A breaking change would ship under a new path (/api/v2/), never in place. Null values are empty CSV cells / JSON null - never zero.

Examples

curl

curl -s https://futuresbench.com/api/v1/latest.json | head -c 400

Python / pandas

import pandas as pd
gold = pd.read_csv("https://futuresbench.com/data/cot/gold.csv",
                   parse_dates=["report_date"])
print(gold.tail())

Google Sheets

=IMPORTDATA("https://futuresbench.com/data/cot/all-latest.csv")

JavaScript

const r = await fetch("https://futuresbench.com/api/v1/latest.json");
const { report_date, markets } = await r.json();
console.log(report_date, markets.gold.net_noncommercial);

Fair use

There are no keys and no enforced limits - the endpoints are CDN-cached static files and normal use costs us nearly nothing. If you're polling for the weekly release, once a minute from 3:30 p.m. ET on Fridays is plenty (the data is weekly). For bulk backfills, each market is one file - please don't re-download unchanged history on a schedule.

Questions or a use case that needs more: data@futuresbench.com.

Source & licensing

Underlying data: CFTC Commitments of Traders reports, U.S. federal public domain. Derived metrics (net positions, COT index, z-scores) are computed as documented in the methodology. A link back to futuresbench.com when you publish something built on this data is appreciated.