CFTC Commitments of Traders (COT) Report Scraper
Pricing
Pay per event
CFTC Commitments of Traders (COT) Report Scraper
Pull the CFTC's weekly Commitments of Traders reports straight from its public Socrata data portal — trader positioning across agricultural, metals, energy, currency, and financial futures markets. Filter by report type, commodity, market, and date range. No API key required.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
🎯 What this scrapes
The CFTC publishes a Commitments of Traders (COT) report every Friday, breaking down who holds what in the futures and options markets it regulates: wheat, corn, soybeans, gold, silver, copper, crude oil, natural gas, currencies, interest-rate futures, and equity indices. Traders read it every week to see how speculators are positioned against commercial hedgers. This Actor is a direct client for the CFTC's own public Socrata open-data portal (publicreporting.cftc.gov) — the same backend behind the CFTC's own COT visualizations — across all 6 published report-type datasets (Legacy / Disaggregated / Traders-in-Financial-Futures, each in Futures-Only and Futures-&-Options-Combined variants). Give it a report type, an optional commodity or market filter, and a date range, and it returns one clean row per market/report-date combination instead of a Socrata query string you'd otherwise have to hand-build yourself.
🔥 What we handle for you
- 🗂️ All 6 COT datasets in one Actor — Legacy, Disaggregated, and Traders in Financial Futures, each in Futures-Only or Futures-&-Options-Combined form, selectable by a single
reportTypefield. - 🔍 Commodity and market filters — narrow to
WHEAT,GOLD,CRUDE OIL, or a specific exchange without hand-writing a Socrata$whereclause. - 📅 Date-range control — pull one week's report or backfill years of history; the underlying dataset goes back decades per report type.
- 🔢 Numeric fields normalized — open interest, long/short positions, and week-over-week changes arrive as numbers, not the raw JSON strings the source API returns.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO date strings, stable Socrata row ids, JSON / CSV / Excel export straight from the Apify Console.
- 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge.
💡 Use cases
- Futures trading desks — track how speculators vs. commercials are positioned week over week for a watchlist of commodities.
- Quant research — backfill years of positioning history per market to build sentiment or crowding indicators.
- Commodity market newsletters — pull the latest report every Friday and auto-generate a positioning summary.
- Risk/compliance teams — monitor open interest and concentration in specific contracts over time.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
reportType | string | no | 'legacy_futures_only' | Which of the CFTC's 6 Commitments of Traders datasets to query (Socrata dataset id shown in parens). |
commodity | string | no | 'WHEAT' | Optional filter on commodity_name (e.g. WHEAT, GOLD, CRUDE OIL, NATURAL GAS). Omitted = all commodities. |
market | string | no | 'CHICAGO BOARD OF TRADE' | Optional substring filter on market_and_exchange_names (e.g. CHICAGO BOARD OF TRADE, COMMODITY EXCHANGE… |
dateFrom | string | no | '2026-06-30' | Inclusive lower bound on report_date_as_yyyy_mm_dd (YYYY-MM-DD). |
dateTo | string | no | '2026-09-15' | Inclusive upper bound on report_date_as_yyyy_mm_dd (YYYY-MM-DD). |
maxResults | integer | no | 500 | Maximum rows returned per run (1-5000). |
proxyConfiguration | object | no | {'useApifyProxy': False} | Apify Proxy configuration. Default is a direct connection — the CFTC's Socrata portal is a public, keyless open-data… |
Example input
{"reportType": "legacy_futures_only","commodity": "WHEAT","market": "CHICAGO BOARD OF TRADE","dateFrom": "2026-06-01","dateTo": "2026-09-15","maxResults": 3,"proxyConfiguration": {"useApifyProxy": false}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
id | string | Socrata row id for this report row. |
report_type | string | Which of the 6 report-type datasets this row came from (mirrors the reportType input). |
market_and_exchange_names | string | Full market and exchange name as published by the CFTC. |
report_date_as_yyyy_mm_dd | string | Report date (ISO YYYY-MM-DD). |
commodity_name | string | Commodity name as published by the CFTC. |
cftc_contract_market_code | string | CFTC's internal contract market code for this market. |
open_interest_all | number | Total open interest across all trader categories. |
change_in_open_interest_all | number | Week-over-week change in open interest. |
traders_tot_all | number | Total number of traders reported for this market on this date. |
noncomm_positions_long_all | number | Non-commercial (speculator) long positions. Populated for Legacy report types only. |
noncomm_positions_short_all | number | Non-commercial (speculator) short positions. Populated for Legacy report types only. |
comm_positions_long_all | number | Commercial (hedger) long positions. Populated for Legacy report types only. |
comm_positions_short_all | number | Commercial (hedger) short positions. Populated for Legacy report types only. |
prod_merc_positions_long | number | Producer/merchant/processor/user long positions. Populated for Disaggregated report types only. |
prod_merc_positions_short | number | Producer/merchant/processor/user short positions. Populated for Disaggregated report types only. |
swap_positions_long_all | number | Swap dealer long positions. Populated for Disaggregated report types only. |
swap_positions_short_all | number | Swap dealer short positions. Populated for Disaggregated report types only. |
m_money_positions_long_all | number | Managed money long positions. Populated for Disaggregated report types only. |
m_money_positions_short_all | number | Managed money short positions. Populated for Disaggregated report types only. |
dealer_positions_long_all | number | Dealer/intermediary long positions. Populated for TFF report types only. |
dealer_positions_short_all | number | Dealer/intermediary short positions. Populated for TFF report types only. |
asset_mgr_positions_long | number | Asset manager/institutional long positions. Populated for TFF report types only. |
asset_mgr_positions_short | number | Asset manager/institutional short positions. Populated for TFF report types only. |
lev_money_positions_long | number | Leveraged funds long positions. Populated for TFF report types only. |
lev_money_positions_short | number | Leveraged funds short positions. Populated for TFF report types only. |
other_rept_positions_long | number | Other-reportables long positions. Populated for Disaggregated and TFF report types only. |
other_rept_positions_short | number | Other-reportables short positions. Populated for Disaggregated and TFF report types only. |
Example output
{"id": "row-6dca-aqww-example","report_type": "legacy_futures_only","market_and_exchange_names": "WHEAT-SRW - CHICAGO BOARD OF TRADE","report_date_as_yyyy_mm_dd": "2026-09-15","commodity_name": "WHEAT","cftc_contract_market_code": "001602","open_interest_all": 412873,"change_in_open_interest_all": -3211,"traders_tot_all": 487,"noncomm_positions_long_all": 98123,"noncomm_positions_short_all": 134502,"comm_positions_long_all": 251340,"comm_positions_short_all": 198211}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.2 | One-off warm-up charge per run |
result | $0.003 | Per dataset item |
Example: 1 000 rows at the rates above ≈ $3.20. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
- Report coverage, publication cadence (weekly, Fridays, for the prior Tuesday), and historical depth are set entirely by the CFTC — this Actor mirrors what the source publishes, nothing more.
commodityandmarketare server-side text filters against the CFTC's own field values; if a market's name doesn't match your filter text, use a broader term or leave it unset.- This Actor returns the structured COT report rows only — it does not compute derived indicators (e.g. net-positioning z-scores); that's a downstream analysis step.
❓ FAQ
Do I need a CFTC or Socrata API key?
No. The CFTC's public reporting portal is a keyless, public open-data API — this Actor doesn't require any credentials.
Which report type should I pick?
legacy_futures_only is the classic COT report most traders reference first. Switch to disaggregated_* for physical-commodity markets broken into producer/merchant, swap dealer, managed money, and other-reportable categories, or tff_* for financial futures (rates, currencies, equity indices) broken into dealer, asset manager, leveraged funds, and other-reportable categories.
How far back does the data go?
Each of the 6 datasets covers a different historical range published directly by the CFTC — some back to the late 1990s/2000s. Leave dateFrom/dateTo unset to pull the widest available window (subject to maxResults).
What happens if my filter combination matches nothing?
The run succeeds with zero rows and a status message describing exactly what was searched — you're never charged for rows that don't exist.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.