CFTC COT Futures Positioning Scraper (Commitments of Traders)
Pricing
from $11.34 / 1,000 positioning records
CFTC COT Futures Positioning Scraper (Commitments of Traders)
Weekly CFTC Commitments of Traders positioning by trader category: legacy, disaggregated and financial futures. Long, short, net, weekly change and % of open interest per market. Export to JSON, CSV or Excel.
Pricing
from $11.34 / 1,000 positioning records
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
CFTC COT Futures Positioning Scraper (Commitments of Traders)
Here is one real result, with every field the actor returns:
{"reportType": "legacy","reportTypeLabel": "Legacy Futures-Only","marketName": "GOLD - COMMODITY EXCHANGE INC.","contractMarketName": "GOLD","exchange": "COMMODITY EXCHANGE INC.","commodity": "GOLD","commodityGroup": "NATURAL RESOURCES","commoditySubgroup": "PRECIOUS METALS","contractCode": "088691","reportDate": "2026-08-11","reportWeek": "2026 Report Week 32","contractUnits": "(CONTRACTS OF 100 TROY OUNCES)","futuresOnlyOrCombined": "FutOnly","openInterest": 400309,"changeInOpenInterest": 28758,"totalTraders": 297,"primaryCategory": "Non-Commercial","primaryLong": 250936,"primaryShort": 32996,"primaryNet": 217940,"primaryChangeLong": 23923,"primaryChangeShort": 3617,"primaryChangeNet": 20306,"primaryPctOfOiLong": 62.7,"primaryPctOfOiShort": 8.2,"pctLongOfOI": 62.69,"nonCommercialLong": 250936,"nonCommercialShort": 32996,"nonCommercialSpread": 28937,"netNonCommercial": 217940,"changeNonCommercialLong": 23923,"changeNonCommercialShort": 3617,"changeNetNonCommercial": 20306,"pctOiNonCommercialLong": 62.7,"pctOiNonCommercialShort": 8.2,"commercialLong": 69385,"commercialShort": 322025,"netCommercial": -252640,"changeCommercialLong": -2447,"changeCommercialShort": 23702,"pctOiCommercialLong": 17.3,"pctOiCommercialShort": 80.4,"totalReportableLong": 349258,"totalReportableShort": 383958,"nonReportableLong": 51051,"nonReportableShort": 16351,"netNonReportable": 34700,"aiBias": null,"aiExtremeness": null,"aiInterpretation": null,"source": "CFTC Commitments of Traders (COT)","observedAt": "2026-08-21T02:25:16.778Z","error": null}
The most complete CFTC Commitments of Traders scraper available. It returns every trader-category position the weekly COT reports expose (long, short, spreading, weekly change and percent of open interest), plus derived fields such as net positions per category, net weekly change and long-as-percent-of-open-interest, and gives you filters for report type, market name, contract code, date range and latest week only so you get exactly the market-weeks you need across the Legacy, Disaggregated and Traders in Financial Futures reports.
Input · Output · Pricing · Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
- More scrapers at scrapers.lat
What it does
This actor returns weekly CFTC Commitments of Traders (COT) positioning data, one clean record per market and report week. It covers three report families and lets the input pick which one:
- Legacy Futures-Only splits every market into Non-Commercial (large speculators), Commercial (hedgers) and Non-Reportable (small traders).
- Disaggregated Futures-Only breaks physical-commodity markets into Producer/Merchant/Processor/User, Swap Dealers, Managed Money and Other Reportables.
- Traders in Financial Futures (TFF) breaks financial markets into Dealer/Intermediary, Asset Manager/Institutional, Leveraged Funds and Other Reportables.
For each market-week you get open interest and its weekly change, the number of reporting traders, and for every trader category the long, short, net, weekly change and percent of open interest. Derived fields include net positions per category, net weekly change and long as a percent of open interest, so you can spot crowded or stretched positioning without post-processing.
Quickstart
Latest week for a single market in the Legacy report:
{"reportType": "legacy","market": "GOLD","latestOnly": true,"maxResults": 3}
Managed Money positioning in crude oil from the Disaggregated report:
{"reportType": "disaggregated","market": "CRUDE OIL","latestOnly": true,"maxResults": 5}
A history of weekly reports for one market using a date range:
{"reportType": "tff","market": "EURO FX","reportDateFrom": "2025-01-01","reportDateTo": "2026-08-31","latestOnly": false,"maxResults": 100}
Input reference
| Name | Type | Required | Description | Example |
|---|---|---|---|---|
reportType | string (enum) | no | Which COT report to read: legacy, disaggregated or tff. Default legacy. | legacy |
market | string | no | Case-insensitive substring match on the market and exchange name. Leave empty for every market. | GOLD |
contractCode | string | no | Exact CFTC contract market code for a precise single-market pull. | 088691 |
reportDateFrom | string | no | Earliest report week to include (YYYY-MM-DD). | 2025-01-01 |
reportDateTo | string | no | Latest report week to include (YYYY-MM-DD). | 2026-08-31 |
latestOnly | boolean | no | Return only the most recent report week for the matching markets. Default true. | true |
includeAiSignal | boolean | no | Opt-in add-on. Adds an AI read of each market's speculative net position. Paid plans only. | false |
maxResults | integer | no | Maximum records to return. Free plans are capped at 10. | 10 |
Output reference
| Name | Type | Description |
|---|---|---|
reportType | string | Report family: legacy, disaggregated or tff |
reportTypeLabel | string | Human label for the report family |
marketName | string | CFTC market and exchange name |
contractMarketName | string | Short contract market name |
exchange | string | Exchange the contract trades on |
commodity | string | Commodity name |
commodityGroup | string | Commodity group |
commoditySubgroup | string | Commodity subgroup |
contractCode | string | CFTC contract market code |
reportDate | string | Report week date (YYYY-MM-DD) |
reportWeek | string | Report week label |
contractUnits | string | Units of the underlying contract |
futuresOnlyOrCombined | string | Futures-only or futures plus options combined |
openInterest | number | Total open interest |
changeInOpenInterest | number | Weekly change in open interest |
totalTraders | number | Number of reporting traders |
primaryCategory | string | Main speculative category for the report type |
primaryLong / primaryShort / primaryNet | number | Primary category long, short and net |
primaryChangeLong / primaryChangeShort / primaryChangeNet | number | Weekly change in primary long, short and net |
primaryPctOfOiLong / primaryPctOfOiShort | number | Primary long and short as reported percent of open interest |
pctLongOfOI | number | Derived: primary long divided by open interest, percent |
nonCommercialLong / nonCommercialShort / nonCommercialSpread / netNonCommercial | number | Legacy: non-commercial positions |
changeNonCommercialLong / changeNonCommercialShort / changeNetNonCommercial | number | Legacy: weekly change in non-commercial |
pctOiNonCommercialLong / pctOiNonCommercialShort | number | Legacy: non-commercial percent of open interest |
commercialLong / commercialShort / netCommercial | number | Legacy: commercial positions |
changeCommercialLong / changeCommercialShort | number | Legacy: weekly change in commercial |
pctOiCommercialLong / pctOiCommercialShort | number | Legacy: commercial percent of open interest |
totalReportableLong / totalReportableShort | number | Legacy: total reportable positions |
producerMerchantLong / producerMerchantShort / netProducerMerchant | number | Disaggregated: producer/merchant/processor/user |
swapDealerLong / swapDealerShort / netSwapDealer | number | Disaggregated: swap dealers |
managedMoneyLong / managedMoneyShort / netManagedMoney | number | Disaggregated: managed money |
changeManagedMoneyLong / changeManagedMoneyShort / changeNetManagedMoney | number | Disaggregated: weekly change in managed money |
pctOiManagedMoneyLong / pctOiManagedMoneyShort | number | Disaggregated: managed money percent of open interest |
dealerLong / dealerShort / netDealer | number | TFF: dealer/intermediary |
assetManagerLong / assetManagerShort / netAssetManager | number | TFF: asset manager/institutional |
leveragedFundsLong / leveragedFundsShort / netLeveragedFunds | number | TFF: leveraged funds |
changeLeveragedFundsLong / changeLeveragedFundsShort / changeNetLeveragedFunds | number | TFF: weekly change in leveraged funds |
pctOiLeveragedFundsLong / pctOiLeveragedFundsShort | number | TFF: leveraged funds percent of open interest |
otherReportableLong / otherReportableShort / netOtherReportable | number | Other reportables (disaggregated and tff) |
nonReportableLong / nonReportableShort / netNonReportable | number | Non-reportable (small traders) |
aiBias / aiExtremeness / aiInterpretation | string | AI positioning signal (add-on only) |
source | string | Data source |
observedAt | string | When the record was scraped |
error | string | Error message, if any |
Fields that do not apply to the chosen report type are returned as null so the column layout stays consistent.
Example output record
A real Managed Money record from the Disaggregated report:
{"reportType": "disaggregated","marketName": "CRUDE OIL, LIGHT SWEET-WTI - ICE FUTURES EUROPE","reportDate": "2026-08-11","openInterest": 797158,"primaryCategory": "Managed Money","managedMoneyLong": 15527,"managedMoneyShort": 23963,"netManagedMoney": -8436,"changeNetManagedMoney": -1346,"netSwapDealer": -77668,"netProducerMerchant": 81931,"pctLongOfOI": 1.95}
Run via API and CLI
Start a run with the Apify API:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~cftc-cot-futures-positioning-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"reportType":"legacy","market":"E-MINI S&P","latestOnly":true,"maxResults":5}'
Or with the Apify CLI:
apify call scrapers_lat/cftc-cot-futures-positioning-scraper \--input '{"reportType":"disaggregated","market":"CRUDE OIL","latestOnly":true,"maxResults":5}'
Fetch results
Read the dataset items from a finished run:
$curl "https://api.apify.com/v2/actor-runs/RUN_ID/dataset/items?token=YOUR_TOKEN&format=json"
Swap format=json for format=csv or format=xlsx to export to CSV or Excel.
Billing and limits
- Pay per result. You are charged for each positioning record returned, never for empty or failed runs.
- Events: a one-time actor start, a
resultevent per market-week record, and an opt-inai_positioning_signaladd-on billed only when a usable AI signal is produced. - The AI add-on is disabled for free Apify plans and never charges when the model returns nothing usable.
- Free Apify plans are capped at 10 records per run. Paid plans can raise
maxResults. - A configured spend limit is respected: once reached, the run stops emitting billable records.
- If no market matches your filters, the actor returns a single non-billable row describing the mismatch.
FAQ and troubleshooting
Which report should I use? Use legacy for a broad speculator-versus-hedger split on any market, disaggregated for detailed physical-commodity categories (managed money, swaps, producers), and tff for financial futures (leveraged funds, asset managers, dealers).
How do I target one exact market? Pass contractCode (for example 088691 for gold). A market substring like GOLD can match several related contracts.
How do I get history instead of the latest week? Set latestOnly to false and provide reportDateFrom and reportDateTo, or just a date range.
How fresh is the data? COT reports are published weekly by the CFTC. Each record carries its reportDate and reportWeek so you always know the exact week.
No records came back. Check the market spelling or try a broader substring, confirm the reportType covers that market, and widen or remove the date range.
More scrapers at scrapers.lat
Explore the full catalog of finance, market and compliance scrapers at scrapers.lat.
This actor is not affiliated with, endorsed by, or sponsored by the CFTC. It returns public data for research and analysis.
