# CFTC COT Scraper: Positions and Extremes (`parselab/cftc-commitments-of-traders-scraper`) Actor

Scrape the weekly CFTC Commitments of Traders report for every futures market. Get long, short and net positions of each trader group with weekly changes, percentile, COT index, z-score and concentration. Screen markets at extremes, with history. Export to CSV or Excel.

- **URL**: https://apify.com/parselab/cftc-commitments-of-traders-scraper.md
- **Developed by:** [ParseLab](https://apify.com/parselab) (community)
- **Categories:** Other, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.75 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## CFTC COT Report Scraper: Net Positions, Percentiles and Extremes

This CFTC Commitments of Traders scraper reads the weekly report that shows how big traders are positioned in US futures markets: crude oil, gold, corn, natural gas, currencies, interest rates, stock indexes and more. It gives you one clean row per market and week, with the long, short and net position of every trader group, and the numbers that traders compute by hand in a spreadsheet.

On top of the raw counts, each trader group gets the weekly change, the percent of open interest, a percentile rank, a COT index from 0 to 100, a z-score and the change over four weeks, all measured against the group's own history (three years by default). The extremes mode skips the browsing: it returns only the markets where managed money or another speculator group sits at an extreme, so the crowded trades come first.

Futures traders, commodity analysts, quant researchers, newsletter writers and risk teams use it as a positioning and sentiment feed.

### What can you do with this CFTC COT scraper?

- Get the latest report for every market in one run
- See where managed money is net long or net short, and how fast that changed
- Find markets with the most extreme speculator positions in three years
- Build a positioning history of one market, week by week, for charts and backtests
- Compare producers and swap dealers with hedge funds in crude oil or gold
- Follow leveraged funds and asset managers in currencies, rates and stock indexes
- Watch concentration: how much of the market the top four and top eight traders hold
- Include or leave out options, and switch between three report types
- List all markets with their codes, exchanges and report dates
- Export to CSV or Excel, or send new reports to Slack and your own tools

### What data can you extract from the COT report?

| Mode | One row is | Highlights |
|---|---|---|
| Weekly positions | One market and one week | Report date, expected release date, market, exchange, commodity group, open interest and its change, number of traders, concentration ratios, and for every trader group: long, short, spread, net, net as percent of open interest, change of longs and shorts, net change, percent of open interest, number of traders, net percentile, COT index, z-score, lookback minimum and maximum, change over four weeks |
| Extremes | One market at an extreme | The same fields plus the list of signals in words and the number of signals, sorted by how extreme the position is |
| Markets | One market | Name, code, exchange, group, subgroup, contract units, first and last report date, number of reports, active flag, latest open interest |

Report types: disaggregated (producers, swap dealers, managed money, other reportables, non-reportable), traders in financial futures (dealers, asset managers, leveraged funds, other reportables, non-reportable) and legacy (non-commercial, commercial, non-reportable).

### How to scrape the CFTC COT report

1. Choose **Weekly positions**, **Extremes** or **Markets**.
2. Pick the report type. Disaggregated fits commodities, financial fits currencies, rates and indexes.
3. Type market names such as GOLD, WTI or EURO FX, or leave empty for all markets.
4. For history, set **Weeks of history** or a start date.
5. Set **Max Items** and click **Start**.
6. Export the dataset as CSV, Excel or from the Apify console.

### Input example

```json
{
  "mode": "positions",
  "reportType": "disaggregated",
  "markets": ["WTI", "GOLD", "CORN"],
  "weeksBack": 52,
  "maxItems": 500
}
```

### Output example

```json
{
  "reportDate": "2026-10-06",
  "market": "WTI-PHYSICAL - NEW YORK MERCANTILE EXCHANGE",
  "commodityGroup": "Natural Resources",
  "openInterest": 1889422,
  "openInterestChange": 10846,
  "managedMoneyLong": 178353,
  "managedMoneyShort": 124755,
  "managedMoneyNet": 53598,
  "managedMoneyNetChange": -25994,
  "managedMoneyNetPercentile": 17.3,
  "managedMoneyCotIndex": 31.4,
  "managedMoneyNetZScore": -0.84,
  "producerMerchantNet": 335010,
  "swapDealersNet": -461468,
  "top4TradersGrossLongPctOi": 17.5
}
```

### Extremes output example

```json
{
  "reportDate": "2026-10-06",
  "market": "CORN - CHICAGO BOARD OF TRADE",
  "openInterest": 1859993,
  "managedMoneyNet": 329839,
  "managedMoneyNetPercentile": 93.6,
  "extremeSignals": ["Managed money: net position at an extreme high, above 93.6% of the last 156 weeks"]
}
```

### How much does it cost to scrape the COT report?

You pay per result: $21 per 1,000 rows plus a tiny start fee. The free plan returns up to 10 rows per run. The latest report for every market is about 400 rows, a full year of one market is 52 rows.

### Tips for better results

- The report is released every Friday afternoon (Eastern time) for positions held on the Tuesday before. The expected release date is in each row, and holidays can delay it.
- Percentile, COT index and z-score compare a group with its own last 156 weeks by default. Raise the lookback to 260 for five years.
- Thin markets can show extreme numbers on tiny positions. Use the minimum open interest filter, for example 20,000 contracts, to hide them.
- Futures only is the classic report. Turn on options to include the futures equivalent of options positions.
- Market names match any part of the text, so GOLD also returns micro gold. Use the contract code from the markets mode for an exact market.
- The net position is long minus short. Spread positions are shown on their own and are not part of the net.
- A schedule every Friday evening with the latest report gives you a weekly positioning table without any manual work.
- Positions are not forecasts. Large speculative positions can grow further before they turn.

### Who uses COT data?

- **Futures and commodity traders** gauge crowding and sentiment.
- **Quant researchers** use positioning as a factor in backtests.
- **Analysts and newsletter writers** publish weekly positioning notes.
- **Risk teams and producers** watch what funds do in their markets.

### Automate and connect

Schedule the Actor every Friday and send the table to Google Sheets, Slack, Zapier, Make or n8n, or trigger a webhook when a run ends.

### FAQ

**Do I need an account or a login?**
No. The Actor works without any login.

**What is the COT index?**
The position of the net position between the lowest and the highest value of the lookback period, from 0 to 100. A value near 100 means the group is as long as it was in the period.

**How is the percentile different?**
It shows the share of weeks in the lookback period with a net position at or below the current one. A value of 97 means the position is higher than in 97 percent of the weeks.

**What is managed money?**
Hedge funds and commodity trading advisers in the disaggregated report. In the financial report the similar groups are leveraged funds and asset managers.

**How far back does the history go?**
The legacy report starts in 1995 for many markets and the other two reports in 2006. Use the markets mode to see the first report of each market.

**Can I get several markets at once?**
Yes. Type as many names or contract codes as you like.

**Is this investment advice?**
No. The data is public information and not a recommendation.

### Legal note

This Actor collects information that is publicly visible on the website. Check the source site's terms and your local rules before using the data. Nothing here is financial advice.

### Support

Missing a field or found a bug? Open an issue from the Actor page.

# Actor input Schema

## `maxItems` (type: `integer`):

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000.

## `mode` (type: `string`):

Positions returns the weekly positions of every trader group per market. Extremes returns only the markets where a speculator group sits at an extreme compared with its own history. Markets returns the list of markets with codes and report dates.

## `reportType` (type: `string`):

Disaggregated splits traders into producers, swap dealers, managed money and others and fits commodities. Financial splits them into dealers, asset managers and leveraged funds and fits currencies, rates and stock indexes. Legacy has commercial and non-commercial traders for every market.

## `futuresAndOptionsCombined` (type: `boolean`):

Off uses futures only, which is the classic report. On adds the futures equivalent of options positions.

## `markets` (type: `array`):

Part of a market name such as GOLD, CRUDE OIL, EURO FX, BITCOIN or S\&P 500, or the CFTC contract code such as 088691. Leave empty for all markets.

## `commodityGroups` (type: `array`):

Part of a group or subgroup name such as AGRICULTURE, NATURAL RESOURCES, FINANCIAL INSTRUMENTS, METALS, ENERGY or GRAINS.

## `exchanges` (type: `array`):

Part of an exchange name or its code, for example CME, CHICAGO BOARD OF TRADE, NEW YORK MERCANTILE EXCHANGE or ICE.

## `weeksBack` (type: `integer`):

Positions mode. How many weekly reports to return per market. 1 returns only the latest report. For example 52 returns one year.

## `dateFrom` (type: `string`):

Positions mode. First report date, in the form 2025-01-07. It replaces the weeks of history.

## `dateTo` (type: `string`):

Last report date. Leave empty for the latest report.

## `lookbackWeeks` (type: `integer`):

Each trader group gets a percentile, a COT index and a score compared with this many weeks before the report. 156 weeks is three years, 260 is five years.

## `extremeThreshold` (type: `integer`):

Extremes mode. A speculator group is an extreme when its net position is at or above this percentile (net long) or at or below 100 minus it (net short). Default 90.

## `minOpenInterest` (type: `integer`):

Skip markets and weeks with fewer open contracts than this, which hides thin markets. For example 20000.

## `sortBy` (type: `string`):

For latest reports and extremes. Extremeness is only used in extremes mode.

## Actor input object example

```json
{
  "maxItems": 10,
  "mode": "positions",
  "reportType": "disaggregated",
  "futuresAndOptionsCombined": false,
  "markets": [
    "GOLD"
  ],
  "weeksBack": 1,
  "lookbackWeeks": 156,
  "extremeThreshold": 90,
  "sortBy": "openInterest"
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10,
    "markets": [
        "GOLD"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("parselab/cftc-commitments-of-traders-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxItems": 10,
    "markets": ["GOLD"],
}

# Run the Actor and wait for it to finish
run = client.actor("parselab/cftc-commitments-of-traders-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "markets": [
    "GOLD"
  ]
}' |
apify call parselab/cftc-commitments-of-traders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parselab/cftc-commitments-of-traders-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/NlB59Brl4IWsHetvx/builds/XPOknPreUkmrsZu4b/openapi.json
