# MF Rural Scraper: Brazil Tractors, Trucks & Farm Machinery (`recordsdata/mfrural-scraper`) Actor

Scrape mfrural.com.br, Brazil's farm and heavy machinery marketplace: tractor, harvester, truck and implement ads with price in BRL, make, model, year, hours, location and photos, plus official shops and tractor prices by year. Filter by category, brand, state, price and year. No login.

- **URL**: https://apify.com/recordsdata/mfrural-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $22.00 / 1,000 ad from a lists

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

![RecordsData](https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3)

## 🚜 MF Rural Scraper - Brazil Tractors, Harvesters, Trucks and Farm Machinery - RecordsData

> 🚀 **Export mfrural.com.br listings in minutes.** Read the public ads of MF Rural, Brazil's marketplace for farm and heavy machinery: tractors, combine harvesters, trucks, implements, construction machines, parts, aircraft and farm inputs. Filter by category, brand, state, city, price, year, condition and seller type. Prices come as numbers in BRL. Open every ad for the description and all photos, list the official shops, or pull average tractor prices by year. No login, no browser, no proxy.

**MF Rural Scraper is an Apify Actor that exports public listings from mfrural.com.br as typed rows: price in BRL, make, model, year, hours of use, power, city and state, photos, seller type and official shop data.** It also returns average tractor prices per year for a brand, model and state. A run of 3 ads finishes in about 3 seconds and uses under 50 MB of memory.

| 🎯 Target audience | 💡 Primary use cases |
|---|---|
| Machinery dealers and brokers | Competitor stock and asking prices by brand, model, state and year |
| Banks, leasing firms, insurers and appraisers | Used tractor and truck valuation from live asking prices and yearly averages |
| Exporters and importers | Sourcing lists of Brazilian machinery with photos and city |
| Manufacturers, parts and input sellers | Dealer directory, brand share by state, demand by category |
| Data teams and researchers | Brazilian agribusiness price tracking and monitoring |

### 📋 What the MF Rural Scraper does

The Actor reads the same public pages every visitor of mfrural.com.br sees. Four modes cover the site.

- **search**: ads of the categories you pick (27 choices, from tractors, harvesters, trucks and implements to parts, aircraft, fertilizers, seeds and livestock). Add a text search, brands, states, cities, a price range, year range, new or used and shop or private seller. A list page holds 24 ads, and tractors alone are about 3,100 ads (129 pages on 2026-10-19).
- **urls**: paste ad addresses, plain ad numbers, category lists (for example `/produtos/1-44/tratores-agricolas/parana`), text searches (`/busca/colheitadeira-case`), official shop pages and tractor price pages. Several kinds can be mixed in one run.
- **dealers**: the official shops (Loja Oficial) of the site with name, address handle, logo, description, product categories and number of list pages. A name filter narrows the list.
- **valuations**: average tractor prices per year, by brand, model, drive type and state, taken from the site's own price reference pages.

Turn on **Open every ad** to add the full description and every photo to each row. A **monitor** option returns only ads you have not seen and reports price changes.

### 📊 Output

Every row has a `recordType`: `listing` (an ad from a list), `listing-detail` (a full ad page), `dealer` (an official shop), `price-reference` (tractor prices by year) or `changed-listing` (monitor). Fields without a value are left out, never filled with `null`. Column order is fixed: image first, identity and price next, then specs, location, media, seller, and `scrapedAt` last.

| Field | Type | Example |
|---|---|---|
| `listingId` | string | 962080 |
| `recordType` | string | listing |
| `vehicleType` | string | tractor (also truck, machinery, part) |
| `category` / `subcategory` | string | Agricultural tractors |
| `categoryPath` | array | Caminhões > Caminhões Volkswagen (VW) > Outros |
| `price` / `currency` / `priceUnit` | number / string / string | 420000 / BRL / Unidade |
| `priceOnRequest` | boolean | true when the ad shows no amount |
| `make`, `model`, `driveType` | string | John Deere, 7200 J, 4x4 |
| `year`, `condition` | number / string | 2018, used (new, used) |
| `hoursUsed`, `powerHp` | number | hours of use and engine HP, when the text gives them |
| `city` / `region` / `regionCode` | string | Guaíra / São Paulo / SP |
| `images`, `imageCount`, `imageUrl` | array, number, string | all photos of the ad |
| `viewCount` | number | page views shown on the ad |
| `description` | string | seller text with contacts removed |
| `sellerName`, `sellerUrl`, `isPrivateSeller` | string, string, boolean | shop name for official shops only |
| `dealerSlug`, `dealerCategories`, `logoUrl`, `listingPages` | mixed | official shop rows |
| `pricesByYear`, `averagePriceLastYear`, `listedAds` | array, number, number | price reference rows |

Other groups: price changes (`previousPrice`, `priceChange`, `priceChangePct`, `changeType`), `modelId`, `firstYear`, `lastYear`, `yearsCovered` and the optional `raw` block. The dataset has 52 columns across the five record types, and a full ad row carries about 30 of them depending on what the seller filled in.

Sample `listing` row from a real cloud run (list card):

```json
{
  "imageUrl": "https://img.mfrural.com.br/api/image?url=https://s3.amazonaws.com/mfrural-produtos-us/477734-962080-84086961-trator-john-deere-7200-j-ano-2018.webp&width=767&height=521&mode=4",
  "recordType": "listing",
  "title": "Trator John Deere 7200 J – Ano 2018",
  "listingId": "962080",
  "url": "https://www.mfrural.com.br/detalhe/962080/trator-john-deere-7200-j-ano-2018",
  "sourceSite": "mfrural.com.br",
  "country": "BR",
  "listingType": "sale",
  "vehicleType": "tractor",
  "category": "Agricultural tractors",
  "price": 420000,
  "currency": "BRL",
  "priceUnit": "Unidade",
  "make": "John Deere",
  "year": 2018,
  "city": "Guaíra",
  "region": "São Paulo",
  "regionCode": "SP",
  "scrapedAt": "2026-10-19T06:02:59.796Z"
}
```

Sample `listing-detail` row of a full ad (photo list and description shortened):

```json
{
  "recordType": "listing-detail",
  "title": "Conjunto VW Meteor 29.520 6x4 2022 + Carreta Tanque Facchini 3 Eixos - Óleo Vegetal",
  "listingId": "961899",
  "vehicleType": "truck",
  "category": "Trucks",
  "subcategory": "Caminhões Volkswagen (VW)",
  "categoryPath": ["Caminhões", "Caminhões Volkswagen (VW)", "Outros"],
  "price": 470000,
  "currency": "BRL",
  "make": "Volkswagen (VW)",
  "year": 2022,
  "condition": "used",
  "powerHp": 520,
  "description": "Cavalo 520 cv, 406 mil km + tanque 3 eixos para óleo vegetal. Pronto para trabalhar. ...",
  "city": "Atibaia",
  "region": "São Paulo",
  "regionCode": "SP",
  "images": ["https://img.mfrural.com.br/api/image?url=...&width=767&height=521&mode=4", "..."],
  "imageCount": 8,
  "viewCount": 29,
  "isPrivateSeller": true
}
```

Sample `price-reference` row (yearly list shortened):

```json
{
  "recordType": "price-reference",
  "title": "Trator Massey Ferguson 4275 4x2",
  "url": "https://www.mfrural.com.br/avaliacao-preco-de-trator/trator-massey-ferguson-4275-4x2/brasil/2335",
  "make": "Massey Ferguson",
  "model": "4275",
  "driveType": "4x2",
  "region": "Brasil",
  "modelId": 2335,
  "pricesByYear": [{ "year": 2010, "averagePrice": 100500 }, { "year": 2018, "averagePrice": 178500 }],
  "yearsCovered": 9,
  "firstYear": 2010,
  "lastYear": 2018,
  "averagePriceLastYear": 178500,
  "listedAds": 10
}
```

### ✨ Why choose this Actor

- 🧩 **Whole marketplace, four modes**: list cards, full ads, official shops and price references, each its own record type.
- 🌾 **27 categories**: not only tractors, but trucks, implements, construction machines, parts, aircraft, seeds, fertilizers and livestock.
- 🔎 **Exact scopes**: category, brand, state and city are read from the site's own address scheme, so a state returns only that state. A brand or city the site does not have is reported with the names it does have, never silently widened.
- 🛡️ **Filters you can trust**: price, year, condition and seller type are checked on every row. Ads whose value is missing are left out and counted in the log.
- 🔒 **Private sellers stay private**: their names are never output, phone numbers, e-mails and links are removed from their texts, and only official shops carry a business name.
- 📉 **Tractor price references**: the average price of every year of a model, in one record, with the number of ads behind it.
- 🔁 **Monitor mode**: scheduled runs return only new ads or ads whose price moved.
- ⚡ **Light to run**: plain HTTP, no browser, no proxy, peak memory under 50 MB in the cloud.

### 📈 How it compares to alternatives

No other Actor on the Apify Store reads mfrural.com.br (searched on 2026-10-19). Actors for other machinery marketplaces exist and cover other countries.

| | This Actor | Mascus, TractorHouse, Agrofy, Landwirt and Agriaffaires scrapers |
|---|---|---|
| Site read | mfrural.com.br (Brazil) | mascus.com, tractorhouse.com, agrofy, landwirt.com, agriaffaires.com |
| Brazilian farm machinery ads with prices in BRL | Yes | No, other countries |
| Average tractor price per year by model and state | Yes | No |
| Directory of official shops | Yes | No |
| Category, brand, state and city scopes | Yes | Varies by site |

For Brazilian farm and heavy machinery this is the only dedicated option on the Store.

### 🚀 How to use

1. Create a free account at [console.apify.com](https://console.apify.com) and open the Actor.
2. Choose **What to collect**. For a first test keep `search`, pick **tractors** in **Categories** and set **Maximum items** to 10.
3. Optionally add brands (`John Deere`, `Massey Ferguson`, `Valtra`), states, cities, a price range, years, condition or seller type.
4. Press **Start**. Open the dataset when the run finishes and download JSON, CSV, Excel, XML or HTML.
5. To watch a market, turn on **Only new ads (monitor)** and **Report price changes**, give the search a **Monitor name** and schedule the Actor.

A minimal JSON example:

```json
{ "mode": "search", "categories": ["tractors"], "brands": ["John Deere"], "states": ["Goiás"], "minYear": 2015, "maxItems": 50 }
```

### 💼 Business use cases

**Dealers and brokers** track competitor stock and asking prices by brand, model, state and year. **Lenders, leasing firms and appraisers** value used tractors and trucks with live asking prices and the average per year of manufacture. **Exporters** build sourcing lists with photos and the city of each machine. **Manufacturers and parts sellers** read the shop directory and the parts categories. **Analysts** follow Brazilian machinery prices over time with monitor mode and scheduled runs.

### 🔌 Automating and integrations

Schedule runs in Apify Console and send results to Make, Zapier, n8n, Google Sheets, Slack, Airbyte or your own webhook. The Apify API and the JavaScript and Python clients start runs and read datasets.

### 🤖 Use with AI agents (MCP)

Connect the Apify MCP server (`mcp.apify.com`) to Claude, Cursor or another MCP client and the Actor appears as a tool.

**Tool description:** Scrape mfrural.com.br (Brazil) farm and heavy machinery ads into typed rows with price in BRL, make, model, year, hours, power, city, state, photos and seller type. Also lists official shops and returns average tractor prices per year.

**Example agent prompt:** "Get 30 used John Deere tractors from Goiás on mfrural.com.br with a price between 150,000 and 400,000 BRL." The agent sends `{ "mode": "search", "categories": ["tractors"], "brands": ["John Deere"], "states": ["Goiás"], "condition": "used", "minPrice": 150000, "maxPrice": 400000, "maxItems": 30 }` and analyzes the rows.

### ⚠️ Limits and legal

The Actor reads public pages only, needs no login and keeps to the paths that the site's robots.txt allows. The site terms of use reserve its content, so use the data under them and under the Brazilian data protection law (LGPD). A text search is capped by the site itself at 110 pages (3,300 ads): narrow it with states, cities or categories to go further. Year, condition and seller type exist only on the ad page, so filtering on them opens one ad page per candidate and takes longer in a category where few ads match. **Time limit (minutes)** stops such a run and keeps the rows already delivered.

### ❓ Frequently Asked Questions

#### 🚜 What data can I scrape from mfrural.com.br?

Machinery and agribusiness ads: tractors, combine harvesters, construction machines, implements, trucks, truck bodies, buses, aircraft, parts, tires, farms, services, fertilizers, animal nutrition, seeds, seedlings, pesticides, livestock and more (27 categories). Each ad has a price, location and photo, and a full ad adds the description, every photo, condition, year, hours and power when the text gives them.

#### 🔎 How do I scrape ads for one brand, state or city?

Pick the category, then add brands (`John Deere`), states and cities (`Ribeirão Preto`). They are read as the site's own page for that exact combination. A brand the site does not list for the category is skipped with a warning that shows the available names, and a city with no page produces one free error row instead of a wider list.

#### 🔢 How many ads can one search return?

Everything the site lists for the scope: a list page holds 24 ads and the Actor follows the pages until the list ends. Tractors were 129 pages (about 3,100 ads) on 2026-10-19. **Maximum pages per list** defaults to 100. A text search is cut off by the site at 110 pages.

#### 💵 Which currency and price format are used?

All prices are numbers in BRL, with the unit the seller chose in `priceUnit` (Unidade, Litro, Peça). Ads that show "Preço sob consulta" carry `priceOnRequest: true` and no `price`, and **Only ads with a price** skips them.

#### 🎚️ How do the price, year, condition and seller type filters work?

The site lists cannot filter on them, so the Actor checks every row. Price is checked on the list card. Year, new or used and shop or private need the ad page, so the Actor opens each candidate ad (the log says so) and leaves out ads where the value is missing, counting them in the log.

#### 🧑 Does it return names, phones or e-mails?

Private sellers are never named and their phone numbers are never output (`isPrivateSeller: true`). Phones, e-mails and links in their texts and titles are removed. Official shops (Loja Oficial) are businesses: their name and page address are output, and **Keep shop contact details** keeps the phones and e-mails they wrote in their own texts.

#### 📉 What are the tractor price references?

The site publishes the average asking price per year of manufacture for a brand, model, drive type and state. In `valuations` mode each record holds the whole list (`pricesByYear`), the first and last year, the average of the last year and the number of ads behind it (`listedAds`). Treat averages with 1 or 2 ads with care.

#### 🔁 How do I get only new ads or price changes?

Turn on **Only new ads (monitor)** and give the search a **Monitor name**. The first run returns the ads found and later runs return only ads not seen before. With **Report price changes** an ad whose price moved comes back with `previousPrice`, `priceChange` and `priceChangePct`.

#### 🛡️ Do I need a proxy or an API key?

No. The site answers plain requests from Apify cloud servers, so the Actor uses no proxy and no key. It keeps one gentle request pace shared by all workers.

#### 🧪 What happens if my input is wrong or nothing matches?

Invalid input, for example a minimum price above the maximum, ends the run as succeeded with one free error row that explains the fix, and nothing is charged. A search with no matches finishes with no rows, also at no charge.

#### 🆓 What do free plans get?

Free plans return up to 10 items per run, which is enough to test every mode and check the fields. Paid plans have no item cap beyond the **Maximum items** you set.

#### 📤 Which formats can I export?

JSON, CSV, Excel, XML, HTML and RSS from the dataset page in Apify Console, or through the Apify API and the JavaScript and Python clients. Column order is fixed, with the image first and the scrape time last, so exports line up between runs.

#### ⚖️ Is it legal to scrape mfrural.com.br?

The Actor reads public pages that need no login and does not touch private data. The site terms of use reserve the rights to its content, so use the data in line with them and with the privacy law that applies to you.

### 🔗 Recommended Actors

- [RecordsData collection](https://apify.com/RecordsData): other classifieds, vehicle, machinery and public data scrapers by the same team.

**🆘 Need help?** Write to <contact.punkrecordsdata@gmail.com> or open an issue in the Issues tab.

> **⚠️ Disclaimer:** independent tool, not affiliated with MF Rural. It reads only publicly available data.

# Actor input Schema

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

search = ads for the categories, brands, states and filters below (or a text search). urls = the ad, list, search, shop or price page addresses and ad numbers you list. dealers = official shop (Loja Oficial) profiles. valuations = average tractor prices per year of manufacture, from the site's price evaluation tool.

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

Stops after this many rows (all record types together). Free plans are limited to 10 items per run.

## `categories` (type: `array`):

Sections of the site to read (search mode). Each category is read page by page until it ends. Empty reads agricultural tractors, or the whole marketplace when a text search is given.

## `searchQuery` (type: `string`):

Optional. Words to search on the site, for example John Deere 6125 or colheitadeira. The site search is fuzzy and returns its own relevance order, up to 110 pages (3,300 ads) per search. Combines with categories, states and cities, not with brands.

## `brands` (type: `array`):

Optional. Brands as listed in the site's own filter of each chosen category, for example John Deere, Massey Ferguson, New Holland or Valtra (tractors, trucks, heavy machinery). In other categories the same filter holds sub-types. A name the site does not list for a category is skipped with a warning that shows the available names. In the price references mode these are tractor brands.

## `states` (type: `array`):

Optional. Brazilian states to read, one list per state. Empty reads the whole country. In the price references mode each state gets its own state-level prices (empty = national prices).

## `cities` (type: `array`):

Optional. City names inside the one chosen state, for example Mirandópolis. Needs exactly one state. A city the site has no page for is skipped with a warning.

## `condition` (type: `string`):

New or used. The site writes the condition only on the ad page, so with this filter every candidate ad is opened and checked; ads without a stated condition are left out.

## `sellerType` (type: `string`):

Official shops (Loja Oficial, businesses) or private sellers. Opens every candidate ad. Ads whose seller cannot be told are left out.

## `minPrice` (type: `integer`):

Only ads priced at or above this amount in reais. The listed price is compared whatever its unit. Ads with price on request are left out when a price limit is set. Leave empty for no limit.

## `maxPrice` (type: `integer`):

Only ads priced at or below this amount in reais. Ads with price on request are left out when a price limit is set. Leave empty for no limit.

## `minYear` (type: `integer`):

Only machines of this year of manufacture or later. The year is read from the ad title and text, so every candidate ad is opened and ads without a stated year are left out.

## `maxYear` (type: `integer`):

Only machines of this year of manufacture or earlier. Ads without a stated year are left out.

## `onlyWithPrice` (type: `boolean`):

Leaves out ads that show "Preço sob consulta" (price on request) instead of an amount.

## `startUrls` (type: `array`):

urls mode: mfrural.com.br addresses. Ads (/detalhe/962016), category lists (/produtos/1-44/tratores-agricolas, also with brand, state and city), text searches (/busca/trator-valtra), official shop pages (/jmtratoresadamantina) and tractor price pages (/avaliacao-preco-de-trator/...).

## `listingIds` (type: `array`):

urls mode: ad numbers, the number after /detalhe/ in an ad address.

## `dealerQuery` (type: `string`):

Dealers mode: keep only official shops whose address name (the part after mfrural.com.br/) contains these letters, for example tratores. Empty reads all official shops.

## `models` (type: `array`):

Price references mode: only models whose name contains one of these, for example 6125 or MX 135. Together with brands and states it narrows the price pages to read.

## `fetchDetails` (type: `boolean`):

Adds the full description, all photos, category path, brand and model, condition, year, hours, power, view count and, for official shops, the shop name. Costs one extra site request per ad and uses the detail event price. Switched on automatically by the condition, seller type and year filters.

## `includeContactDetails` (type: `boolean`):

Keeps phone numbers and e-mails written in the texts of official shops. Private sellers never get contact data: their phones, e-mails and names are removed from every text.

## `includeRaw` (type: `boolean`):

Adds a raw object with the unprocessed price text and the category path.

## `onlyNew` (type: `boolean`):

Return only ads this search has not returned before. The memory is stored in your own account. Schedule the run to watch the market.

## `trackPriceChanges` (type: `boolean`):

With Only new ads: ads already seen whose price changed are returned again as changed-listing rows with the previous price.

## `stateKey` (type: `string`):

Name of the memory used by Only new ads. Use one name per saved search. Empty derives a name from your filters.

## `resetSeen` (type: `boolean`):

Clears the memory of this search before the run.

## `maxSearchPages` (type: `integer`):

Stops each list or search after this many pages (24 ads per list page, 30 per search page). A text search is never longer than 110 pages because the site stops there.

## `maxScanMinutes` (type: `integer`):

Stops the run after this many minutes and keeps the rows already delivered. Condition, seller type and year filters open one ad page per candidate, which takes long when few ads match.

## `maxConcurrency` (type: `integer`):

Ad pages read at the same time.

## Actor input object example

```json
{
  "mode": "search",
  "maxItems": 10,
  "categories": [
    "tractors"
  ],
  "brands": [],
  "states": [],
  "cities": [],
  "condition": "all",
  "sellerType": "all",
  "onlyWithPrice": false,
  "startUrls": [
    "https://www.mfrural.com.br/produtos/1-44/tratores-agricolas/sao-paulo"
  ],
  "listingIds": [],
  "dealerQuery": "",
  "models": [],
  "fetchDetails": false,
  "includeContactDetails": false,
  "includeRaw": false,
  "onlyNew": false,
  "trackPriceChanges": false,
  "stateKey": "",
  "resetSeen": false,
  "maxSearchPages": 100,
  "maxScanMinutes": 30,
  "maxConcurrency": 3
}
```

# Actor output Schema

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

Key fields per row

## `fullData` (type: `string`):

Complete dataset with all fields

# 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,
    "categories": [
        "tractors"
    ],
    "searchQuery": "",
    "brands": [],
    "states": [],
    "cities": [],
    "minPrice": 0,
    "maxPrice": 0,
    "startUrls": [
        "https://www.mfrural.com.br/produtos/1-44/tratores-agricolas/sao-paulo"
    ],
    "listingIds": [],
    "models": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/mfrural-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,
    "categories": ["tractors"],
    "searchQuery": "",
    "brands": [],
    "states": [],
    "cities": [],
    "minPrice": 0,
    "maxPrice": 0,
    "startUrls": ["https://www.mfrural.com.br/produtos/1-44/tratores-agricolas/sao-paulo"],
    "listingIds": [],
    "models": [],
}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/mfrural-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,
  "categories": [
    "tractors"
  ],
  "searchQuery": "",
  "brands": [],
  "states": [],
  "cities": [],
  "minPrice": 0,
  "maxPrice": 0,
  "startUrls": [
    "https://www.mfrural.com.br/produtos/1-44/tratores-agricolas/sao-paulo"
  ],
  "listingIds": [],
  "models": []
}' |
apify call recordsdata/mfrural-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordsdata/mfrural-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/jrBwkl7JvSleDSc3k/builds/MtZILZu8PuKH0989O/openapi.json
