OrbTop

CFTC COT Report Scraper - Futures Positioning Data

BUSINESSDEVELOPER TOOLSOTHER

CFTC COT Report Scraper — Commitments of Traders Weekly Positions

Extracts weekly Commitments of Traders (COT) reports from the U.S. Commodity Futures Trading Commission. Returns structured rows — long, short, and spread positions by trader category — for over 680,000 historical records across energy, agriculture, metals, FX, and equity-index markets.

Bloomberg charges for this. The CFTC publishes it for free on a Socrata API that nobody made an Apify actor for, until now.

CFTC COT Report Scraper Features

  • Extracts all six report variants — Legacy Combined, Legacy Futures Only, Disaggregated Combined, Disaggregated Futures Only, Traders in Financial Futures (TFF) Combined, and TFF Futures Only
  • Returns 30+ fields per row — long, short, spread positions for commercial, non-commercial, and non-reportable traders, plus open interest, trader counts, and top-4 concentration metrics
  • Filters by commodity — case-insensitive contains match on commodity_name (e.g. WHEAT, CRUDE OIL, GOLD)
  • Filters by date range — pull just last week's data or the full history back to 2006
  • Filters by market code — target a specific CFTC contract market code if you know exactly what you're after
  • No proxies needed — pure API, no browser, no rate-limit gymnastics required. The CFTC wants you to have this data.
  • Coerces numeric types — all position and open interest fields arrive as strings from the Socrata API; this actor returns them as numbers

Who Uses COT Data?

  • Commodity traders — track non-commercial positioning to gauge speculative sentiment in crude oil, wheat, gold, and natural gas
  • Macro newsletter writers — automate weekly COT updates instead of manually downloading CFTC CSV files every Friday
  • Quant researchers — build positioning datasets for backtesting momentum and contrarian strategies across futures markets
  • Prop shops — monitor commercial vs. non-commercial positioning divergence as a leading indicator
  • FX traders — pull currency futures positioning (EUR, GBP, JPY, AUD) from the TIFF report to track institutional flows
  • Data engineers — feed structured COT rows into a warehouse, replacing the unreliable CFTC CSV download workflow

How It Works

  1. Select a report type — Legacy Combined covers most commodity markets with the commercial / non-commercial split. Disaggregated splits commercial into producer/merchant, swap dealer, and managed money. TFF (Traders in Financial Futures) covers currency, equity-index, and Treasury futures with the dealer / asset manager / leveraged money split.
  2. Set optional filters — commodity name, date range, and market code narrow the results. Leave them blank for everything.
  3. The scraper hits the CFTC's public Socrata API, paginates through the results at 1,000 rows per request, and coerces all numeric fields from strings to numbers before saving.
  4. Results arrive as structured JSON rows in the Apify dataset. Each row is one market-and-week observation.

CFTC COT Input Configuration

{
  "reportType": "legacy_combined",
  "commodityName": "CRUDE OIL",
  "reportDateFrom": "2024-01-01",
  "reportDateTo": "2025-12-31",
  "maxItems": 100,
  "sp_intended_usage": "Commodity positioning analysis",
  "sp_improvement_suggestions": ""
}
Field Type Default Description
reportType string legacy_combined Report variant: legacy_combined, legacy_futures_only, disaggregated_combined, disaggregated_futures_only, financial (TFF Combined), or tff_futures_only
commodityName string (empty) Case-insensitive commodity name filter (e.g. WHEAT, GOLD, CRUDE OIL)
marketCode string (empty) CFTC contract market code filter (e.g. 001612)
reportDateFrom string (empty) Start date in YYYY-MM-DD format
reportDateTo string (empty) End date in YYYY-MM-DD format
socrataAppToken string (empty) Optional free Socrata app token for higher rate limits
maxItems integer 10 Maximum rows to return. 0 = unlimited

Report Type Reference

Value Coverage Trader Categories
legacy_combined Legacy Futures + Options Combined — the most-cited weekly report commercial / non-commercial / non-reportable
legacy_futures_only Legacy Futures Only — excludes options positions commercial / non-commercial / non-reportable
disaggregated_combined Disaggregated Futures + Options Combined — commercial split into producers/merchants, swap dealers, managed money prod_merc / swap / m_money / other_rept / nonrept
disaggregated_futures_only Disaggregated Futures Only prod_merc / swap / m_money / other_rept / nonrept
financial Traders in Financial Futures (TFF) Futures + Options Combined — financial instruments including currency futures dealer / asset_mgr / lev_money / other_rept / nonrept
tff_futures_only Traders in Financial Futures Futures Only dealer / asset_mgr / lev_money / other_rept / nonrept

Each row carries a report_schema field (legacy, disaggregated, or tff) indicating which trader-category block is populated for that row — fields outside that block are emitted as null.

CFTC COT Output Fields

{
  "market_and_exchange_names": "CRUDE OIL, LIGHT SWEET-WTI - NEW YORK MERCANTILE EXCHANGE",
  "report_date": "2025-05-06",
  "report_week": "2025 Report Week 18",
  "contract_market_name": "CRUDE OIL, LIGHT SWEET",
  "cftc_contract_market_code": "067651",
  "cftc_market_code": "NYM",
  "cftc_region_code": "NYC",
  "cftc_commodity_code": "067",
  "commodity_name": "CRUDE OIL",
  "report_type": "legacy_combined",
  "open_interest_all": 1802413,
  "noncomm_positions_long_all": 399214,
  "noncomm_positions_short_all": 241380,
  "noncomm_positions_spread_all": 72881,
  "comm_positions_long_all": 1207844,
  "comm_positions_short_all": 1364788,
  "tot_rept_positions_long_all": 1679939,
  "tot_rept_positions_short_all": 1679048,
  "nonrept_positions_long_all": 122474,
  "nonrept_positions_short_all": 123365,
  "change_in_open_interest_all": -34892,
  "pct_of_oi_noncomm_long_all": 22.1,
  "pct_of_oi_noncomm_short_all": 13.4,
  "pct_of_oi_comm_long_all": 67.0,
  "pct_of_oi_comm_short_all": 75.7,
  "traders_tot_all": 482,
  "traders_noncomm_long_all": 152,
  "traders_noncomm_short_all": 106,
  "traders_comm_long_all": 67,
  "traders_comm_short_all": 78,
  "conc_gross_le_4_tdr_long_all": 10.2,
  "conc_gross_le_4_tdr_short_all": 11.4
}
Field Type Description
market_and_exchange_names string Full CFTC market and exchange name
report_date string Report date (YYYY-MM-DD)
report_week string YYYY Report Week WW label
contract_market_name string Contract market name
cftc_contract_market_code string CFTC contract market code
cftc_market_code string CFTC market code
cftc_region_code string CFTC region code
cftc_commodity_code string CFTC commodity code
commodity_name string Commodity name
report_type string Report variant identifier
open_interest_all number Total open interest
noncomm_positions_long_all number Non-commercial long positions
noncomm_positions_short_all number Non-commercial short positions
noncomm_positions_spread_all number Non-commercial spread positions
comm_positions_long_all number Commercial long positions
comm_positions_short_all number Commercial short positions
tot_rept_positions_long_all number Total reportable long positions
tot_rept_positions_short_all number Total reportable short positions
nonrept_positions_long_all number Non-reportable long positions
nonrept_positions_short_all number Non-reportable short positions
change_in_open_interest_all number Week-over-week change in open interest
pct_of_oi_noncomm_long_all number Non-commercial long as % of open interest
pct_of_oi_noncomm_short_all number Non-commercial short as % of open interest
pct_of_oi_comm_long_all number Commercial long as % of open interest
pct_of_oi_comm_short_all number Commercial short as % of open interest
traders_tot_all number Total reportable traders
traders_noncomm_long_all number Non-commercial long traders
traders_noncomm_short_all number Non-commercial short traders
traders_comm_long_all number Commercial long traders
traders_comm_short_all number Commercial short traders
conc_gross_le_4_tdr_long_all number Top-4 traders long concentration (%)
conc_gross_le_4_tdr_short_all number Top-4 traders short concentration (%)

🔍 FAQ

How do I scrape CFTC COT data with Apify? CFTC COT Report Scraper pulls directly from the CFTC's public Socrata API. Configure a report type, set any filters, and run — results are in the dataset within seconds.

What data can I get from the CFTC Commitments of Traders report? CFTC COT Report Scraper returns long, short, and spread positions broken out by trader category (commercial, non-commercial, non-reportable) plus open interest, week-over-week changes, trader counts, and top-4 concentration percentages. That's essentially everything the CFTC publishes for each market and week.

Does CFTC COT Report Scraper need proxies? No. The CFTC public reporting API is open to anyone with an internet connection. No proxies, no browser, no authentication required.

How far back does the COT data go? The Socrata API covers legacy reports back to 2006, with over 270,000 rows in the Legacy Combined dataset alone.

Can I get currency futures positioning with this actor? Yes. Use reportType: "financial" to pull the Traders in Financial Futures (TFF) Combined report, which covers EUR, GBP, JPY, AUD, CAD, and other currency futures alongside equity index and Treasury markets. Returned rows populate the dealer_, asset_mgr_, lev_money_, and other_rept_ trader-category fields. Filter to a specific currency with commodityName (e.g. YEN, EURO, BRITISH POUND).

How much does it cost to run? CFTC COT Report Scraper charges $0.10 per run plus $0.001 per row. Pulling the most recent week of legacy data (roughly 300 markets) costs about $0.40 total.

Need More Features?

Need custom fields, additional date granularity, or a combined multi-report run? File an issue or get in touch.

Why Use CFTC COT Report Scraper?

  • Free data source — the CFTC publishes this weekly; the scraper just makes it programmable without writing your own API client
  • Clean output — all numeric fields are coerced from strings to numbers, so your downstream pipeline doesn't have to parse "1802413" into a real number
  • No proxies, no browser — pure API call with a 100ms courtesy delay, which is more polite than most things that hit government servers