Data costs time. If this saves you some —buy us a coffee
REST API · JSON · 900+ markets

COT Data API

Programmatic access to weekly CFTC Commitments of Traders data across three report tables — Legacy (900+ markets), TFF (130+ financial instruments), and Disaggregated (640+ physical commodities). Pull net positioning, COT Index percentiles, and week-on-week changes for any instrument directly into your application or research environment.

Free tier included3-year rolling history (paid)Bearer token auth
£19/month
cancel any time
  • 900+ instruments
  • 3-year rolling history
  • 60 req/min · 500 req/day
  • Bearer token by email
Get API Access — £19/mo

Secure checkout via Stripe

Tiers

Free

£0

No sign-up required. No auth header.

  • Latest week only (no from/to params)
  • All 900+ instruments
  • Full dense response — positioning, COT Index, z-scores
  • 10 requests / minute
  • US Dollar Index: full history open to all as a live demo
Full Access

Paid

£19/month

Bearer token included on purchase.

  • 3-year rolling history for every instrument
  • All 900+ instruments with full date range
  • from / to query params unlocked
  • 60 requests / minute · 500 requests / day
  • Dedicated API token — revoke or rotate any time

PDF user guide

8-page printable reference — authentication, code examples (PowerShell, curl, Python, Node, Excel, Sheets), CFTC code lookup table, troubleshooting.

Download PDF

Endpoint

Single endpoint. All instruments. Three report tables: Legacy, TFF, Disaggregated.

Request
GET https://cotdata.net/api/cot
Query parameters
instrument string CFTC code, e.g. 088691
table string legacy (default) | tff | disaggregated
from date YYYY-MM-DD · paid only
to date YYYY-MM-DD · paid only
Examples
Latest report — no auth
GET https://cotdata.net/api/cot?instrument=088691
History range — paid tier
GET https://cotdata.net/api/cot?instrument=088691&from=2023-01-01&to=2025-12-31
Auth header
Authorization: Bearer <your-token>

Response — latest mode

Without from / to the API returns a single dense object for the most recent report date. Pass from to get { instrument, table, count, rows: [...] } for charting.

200 OK · application/json · Gold (088691) · table=legacy
{
  "cftc_code": "088691",
  "market_name": "Gold",
  "exchange": "COMEX",
  "report_date": "2024-12-31",
  "table": "legacy",
  "non_commercial": {
    "long": 286741,
    "short": 34892,
    "net": 251849,
    "net_change": 3124,
    "cot_index_26w": 71,
    "cot_index_52w": 68,
    "cot_index_3y": 74,
    "zscore_26w": 1.12,
    "zscore_52w": 0.94,
    "pct_long": 89.1
  },
  "commercial": {
    "long": 98432,
    "short": 347821,
    "net": -249389,
    "net_change": -2876,
    "pct_long": 22.1
  },
  "small_traders": {
    "long": 22341,
    "short": 24882,
    "net": -2541
  },
  "open_interest": 407514
}
200 OK · application/json · Euro FX (099741) · table=tff
{
  "cftc_code": "099741",
  "market_name": "Euro FX",
  "exchange": "CME",
  "report_date": "2024-12-31",
  "table": "tff",
  "leveraged_funds": {
    "long": 142318,
    "short": 198472,
    "net": -56154,
    "net_change": -8421,
    "cot_index_26w": 18,
    "cot_index_52w": 24,
    "cot_index_3y": 31,
    "zscore_26w": -1.42,
    "zscore_52w": -1.18,
    "pct_long": 41.74
  },
  "dealer_intermediary": {
    "long": 88241,
    "short": 64187,
    "net": 24054,
    "net_change": 3128,
    "pct_long": 57.89
  },
  "asset_mgr": {
    "long": 432187,
    "short": 71294,
    "net": 360893
  },
  "other_rept": {
    "long": 41782,
    "short": 32918,
    "net": 8864
  },
  "small_traders": {
    "long": 28471,
    "short": 31204,
    "net": -2733
  },
  "open_interest": 762183
}
200 OK · application/json · Gold (088691) · table=disaggregated
{
  "cftc_code": "088691",
  "market_name": "Gold",
  "exchange": "COMEX",
  "report_date": "2024-12-31",
  "table": "disaggregated",
  "managed_money": {
    "long": 218941,
    "short": 24187,
    "net": 194754,
    "net_change": -4218,
    "cot_index_26w": 65,
    "cot_index_52w": 71,
    "cot_index_3y": 78,
    "zscore_26w": 0.84,
    "zscore_52w": 1.04,
    "pct_long": 90.05
  },
  "producer_merchant": {
    "long": 41827,
    "short": 184129,
    "net": -142302,
    "net_change": 2871,
    "pct_long": 18.51
  },
  "swap_dealer": {
    "long": 56918,
    "short": 163692,
    "net": -106774,
    "net_change": 1893
  },
  "other_rept": {
    "long": 32841,
    "short": 26431,
    "net": 6410,
    "net_change": -127
  },
  "small_traders": {
    "long": 22341,
    "short": 24882,
    "net": -2541
  },
  "open_interest": 407514
}

TFF groups: Leveraged Funds, Dealer/Intermediary, Asset Managers, Other Reportables. COT Index and Z-score are computed against the Leveraged Funds net series. Disaggregated groups: Managed Money, Producer/Merchant, Swap Dealers, Other Reportables. Indicators are computed against the Managed Money net series. Both tables also return the Non-Reportable small_traders group.

Field reference

Every field returned by the latest-mode response, by table. History mode (with from/to) returns the underlying database rows directly with one row per weekly report.

Top-level fields (all tables)

FieldTypeNotes
cftc_codestringCFTC contract market code (may end with "+" for consolidated contracts).
market_namestringCFTC's contract name (e.g. "GOLD"). Falls back to a friendly name if empty.
exchangestring?CFTC market code such as CMX, NYM, CBT (may be null).
report_datestringYYYY-MM-DD — Tuesday cutoff date of the report.
tablestring"legacy" | "tff" | "disaggregated".
open_interestnumberTotal open interest across all categories.

Per-group fields

All groups return long, short, net, and (where shown below) net_change. The primary speculator group additionally returns COT Index, Z-score, and percent-long.

TableGroup keyCFTC nameIndicators?
legacynon_commercialNon-Commercials (large speculators)
legacycommercialCommercials (hedgers)pct_long
legacysmall_tradersNon-Reportables
tffleveraged_fundsLeveraged Funds
tffdealer_intermediaryDealer / Intermediarypct_long
tffasset_mgrAsset Manager / Institutional
tffother_reptOther Reportables
tffsmall_tradersNon-Reportables
disaggregatedmanaged_moneyManaged Money
disaggregatedproducer_merchantProducer / Merchant / Processor / Userpct_long
disaggregatedswap_dealerSwap Dealers
disaggregatedother_reptOther Reportables
disaggregatedsmall_tradersNon-Reportables

Indicator fields (on the primary speculator group only)

FieldTypeRangeNotes
longinteger≥ 0Raw long contracts held by the group.
shortinteger≥ 0Raw short contracts held by the group.
netintegerlong − short.
net_changeintegerWeek-on-week change in net (CFTC-supplied).
cot_index_26wnumber0–100Percentile rank of current net within the last 26 weekly nets.
cot_index_52wnumber0–100Percentile rank over 52 weeks.
cot_index_3ynumber0–100Percentile rank over 156 weeks (≈ 3 years).
zscore_26wnumber(current − 26w mean) / 26w std (population std).
zscore_52wnumberSame shape, 52-week window.
pct_longnumber0–100long / (long + short) × 100, two decimal places.

Primary speculator group = non_commercial (legacy), leveraged_funds (tff), managed_money (disaggregated). Indicators are pre-computed and stored at ingestion, not at query time.

Rate limits

TierRequests / minuteRequests / dayHistory
Free10UnlimitedLatest week only
Paid605003-year rolling window

The 3-year window is a rolling cutoff from today's date. For full history back to 1986, see the one-time data dump.

Common questions

How do I authenticate?

Add an Authorization: Bearer <token> header to your requests. After purchase, you receive an email with a single-use download link. Open it once to retrieve your API token. The link expires after first use — save the token somewhere safe, there is no account portal to retrieve it from.

When is data updated?

The CFTC publishes each Friday's report by approximately 3:30 PM Eastern. Our API typically reflects the new data within minutes of publication.

What does "3-year rolling window" mean?

The from parameter is capped at three years before today. If you pass an earlier date it is silently clamped. For data going back to 1986, purchase the one-time data dump instead.

What is the TFF table?

Traders in Financial Futures — a supplemental CFTC report breaking out Dealer/Intermediary, Asset Manager, Leveraged Funds, and Other Reportables. Pass table=tff to access it.

What is the disaggregated table?

CFTC Disaggregated COT — breaks the Commercial bucket into Producer/Merchant and Swap Dealers, and the Non-Commercial bucket into Managed Money and Other Reportables. Covers physical-commodity markets back to 2006. Pass table=disaggregated to access it.

Can I use this commercially?

Yes. CFTC Commitments of Traders data is published by a US government agency and is in the public domain. You are free to use the data in your own products, research, or services.

How do I find CFTC codes for instruments?

Every instrument page on cotdata.net shows its CFTC code. Alternatively, call the API without a from/to param on any instrument slug — the cftc_code field is in the response.

Get API access

£19/month. Full 3-year history, 900+ markets, 60 req/min. Cancel any time.

Secure checkout via Stripe · Token delivered by email · Cancel any time from your Stripe billing portal

Track CFTC COT reports for commodities, currencies, and futures markets.

Data updated daily from official CFTC sources.