# PneuStore Scraper - Brazil Tire, Wheel and Price Data (`recordsdata/pneustore-scraper`) Actor

Scrape pneustore.com.br, the Brazilian tire and wheel store: car, SUV, motorcycle, truck, farm and bicycle tires, wheels and accessories. PIX and installment prices, stock, ratings, sizes, load and speed codes, EAN and compatible vehicles. Monitor new products and price changes. No login.

- **URL**: https://apify.com/recordsdata/pneustore-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 $20.00 / 1,000 tire or product cards

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)

## PneuStore Scraper - Brazil Tire, Wheel and Price Data - RecordsData

> **PneuStore Scraper is an Apify Actor that extracts public product data from pneustore.com.br, the Brazilian tire and wheel store: PIX and installment prices, stock, ratings, tire size, load and speed codes, Inmetro label, EAN and compatible vehicles for 11,865 products. It runs on plain HTTP with no login, browser or proxy and exports JSON, CSV or Excel.**

| Target audience | Primary use cases |
|---|---|
| Tire dealers, importers and distributors | Competitor price and stock tracking by brand and size |
| Fleet managers and truck operators | Price comparison for truck, bus, OTR and farm tires |
| Price comparison and marketplace teams | A clean BRL product feed with EAN, brand and size |
| Market researchers and analysts | Brand share, discount depth and rating data for the Brazilian tire market |
| Developers and data teams | Typed rows for dashboards, alerts and AI agents |

### What PneuStore Scraper does

The Actor reads the same public pages every visitor of pneustore.com.br sees. Each page carries its data as embedded JSON, so rows are exact and no browser is needed. Four modes cover the site.

- **search**: products of the categories you choose (car, SUV, motorcycle, truck and bus, OTR, bicycle, farm, quad tires, inner tubes, accessories and wheels) with filters for brand, tire size, rim size, terrain, tread design, run flat, price range, stock, free shipping, minimum rating and sort order. Without a category it reads the whole catalog.
- **urls**: paste product pages, category pages (filters in the address are kept), brand pages or just product numbers. Product pages and numbers return the full detailed row.
- **categories**: one summary row per category with product count, price range, brands and rim sizes.
- **brands**: one summary row per brand with product count, price range and the categories it sells in.

Turn on **Open every product page** in search mode to add the specification, EAN, stock quantity, description and the list of compatible cars to each row.

### PneuStore data fields and record types

Every row has a `recordType`: `tire` (product card, fast), `tire-detail` (full product page), `price-change` (monitor), `category` or `brand`. The dataset schema has 83 columns. Fields without a value are left out, never filled with `null`. Column order is fixed: image first, identity and price next, then specs, then media, with `scrapedAt` last.

| Field | Type | Example |
|---|---|---|
| `listingId` | string | 16004776 |
| `title` | string | Pneu Itaro Aro 13 MH01 175/70R13 82T |
| `make` / `model` | string | Itaro / MH01 |
| `price` / `currency` | number / string | 279.9 / BRL (PIX price) |
| `listPrice`, `discountPct` | number | 311, 10 |
| `installments`, `monthlyPayment` | number | 10, 31.1 |
| `inStock`, `stockQuantity` | boolean, number | true, 10 |
| `freeShipping` | boolean | false |
| `rating`, `ratingCount` | number | 4.6, 489 |
| `tireSize`, `width`, `aspectRatio`, `rimDiameter` | string, numbers | 175/70R13, 175, 70, 13 |
| `loadIndex`, `loadCapacityKg`, `speedRating`, `maxSpeedKph` | string, numbers | 82, 475, T, 190 |
| `terrainType`, `treadDesign`, `runFlat` | string, string, boolean | HT - Urbano/Rodoviario, Simetrico, false |
| `energyEfficiency`, `wetGrip`, `noiseDb` | string, string, number | E, C, 72 |
| `ean`, `inmetroRegistration`, `utqg`, `warranty` | string | 6922250419552, 001420/2021, 420AA |
| `compatibleVehicles` | array | make, model, years and versions |
| `categoryPath`, `categoryUrl` | array, string | Pneus > Pneus de carro > Passeio |

Other groups: motorcycle and truck specifications (`plyRating`, `mountingType`, `position`), `features`, `specifications` for codes that have no own column, the price-change fields (`previousPrice`, `priceChange`, `priceChangePct`) and the summary fields of category and brand rows.

Sample `tire-detail` row from a real cloud run (the vehicle list and long text shortened):

```json
{
  "imageUrl": "https://static.verumcommerce.com.br/product/Pneustore/a1bf6d6206b7323eb5da.webp",
  "recordType": "tire-detail",
  "title": "Pneu Itaro Aro 13 MH01 175/70R13 82T",
  "listingId": "16004776",
  "url": "https://www.pneustore.com.br/pneu-itaro-aro-13-mh01-175-70r13-82t-16004776",
  "sourceSite": "pneustore.com.br",
  "country": "BR",
  "vehicleType": "tire",
  "vehicleClass": "car",
  "categoryPath": ["Pneus", "Pneus de carro", "Passeio"],
  "make": "Itaro",
  "model": "MH01",
  "condition": "new",
  "price": 279.9,
  "currency": "BRL",
  "listPrice": 311,
  "discountPct": 10,
  "paymentMethod": "PIX",
  "installments": 10,
  "monthlyPayment": 31.1,
  "inStock": true,
  "stockQuantity": 10,
  "rating": 4.6,
  "ratingCount": 489,
  "tireSize": "175/70R13",
  "rimDiameter": 13,
  "loadIndex": "82",
  "speedRating": "T",
  "maxSpeedKph": 190,
  "energyEfficiency": "E",
  "wetGrip": "C",
  "noiseDb": 72,
  "ean": "6922250419552",
  "compatibleVehicleCount": 23,
  "compatibleVehicles": [{ "make": "FIAT", "model": "UNO", "yearFrom": 2007, "yearTo": 2015, "versions": ["1.0 MILLE WAY ECONOMY FLEX"] }]
}
```

### How to scrape PneuStore tire prices

1. Create a free account at [console.apify.com](https://console.apify.com) and open the Actor.
2. Keep **What to collect** on `search`, pick a category such as Car tires or Motorcycle tires and set **Maximum items** to 10 for a first test.
3. Add filters: brands (`Michelin`, `Pirelli`), a tire size (`205/55R16`), a rim size, a price range in reais or **Only products in stock**.
4. Press **Start**. When the run finishes open the dataset and download JSON, CSV, Excel, XML or HTML.

A minimal JSON example that returns the cheapest in-stock Michelin 205/55R16 tires:

```json
{ "mode": "search", "brands": ["Michelin"], "tireSizes": ["205/55R16"], "inStockOnly": true, "sort": "price-asc", "maxItems": 20 }
```

### Monitor PneuStore prices and new products

Turn on **Only new products** and give the search a **Monitor name**. The first run returns what it finds, later runs return only products not seen before. With **Report price changes** a product whose price moved comes back as a `price-change` row with `previousPrice`, `priceChange` and `priceChangePct`. Schedule the Actor daily or hourly and send the rows to a webhook, a sheet or a Slack channel.

### Why choose this PneuStore scraper

- **Five record types, one dataset**: product cards, full product pages, price changes, categories and brands, each billed separately so you pay only for what you read.
- **Specs that are hard to get by hand**: tire size split into width, aspect ratio and rim, load index with capacity in kg, speed rating with top speed, Inmetro efficiency, wet grip and noise, EAN, and the list of cars each tire fits.
- **Real prices for sold-out products**: the page hides the price of out-of-stock items, the Actor returns it with `inStock: false` (56 percent of the catalog was out of stock on 2026-10-18).
- **Whole catalog reachable**: the site serves at most 10,000 products per address, so the Actor splits the big addresses into their product groups and reaches 11,860 of the 11,865 products.
- **Light to run**: plain HTTP, no browser, no proxy, peak memory 90 MB in the cloud on the heaviest scan.

### How it compares to alternatives

No other Actor on the Apify Store covers pneustore.com.br or any Brazilian tire shop. The closest options are tire or marketplace scrapers for other sites (read on 2026-10-18).

| | This Actor | Kwik Fit Scraper (UK) | Sklepopon Scraper (PL) | Mercado Livre Scraper (BR) |
|---|---|---|---|---|
| Site | pneustore.com.br | kwik-fit.com | sklepopon.com | mercadolivre.com.br |
| Scope | Brazilian tires, wheels, tubes, accessories | UK tyres | Polish tires | Any product, Brazil |
| Tire label data | Inmetro efficiency, wet grip, noise | EU label | EU label | Not a tire specialist |
| Tire size split, load capacity, speed, EAN | Yes | Not listed | Not listed | Not listed |
| Compatible cars per tire | Yes | Not listed | Not listed | Not listed |
| New products and price-change monitor | Yes | Not listed | Not listed | Not listed |
| Price per 1,000 results | from $6.00 | about $2.00 | about $9.00 | about $5.00 |

Pick this Actor for Brazilian tire data. Pick the others for the UK, Poland or general Brazilian marketplace listings.

### Speed, limits and coverage

- A 3-result run takes 2 to 5 seconds for product cards and 3 to 18 seconds with full product pages (median 2.8 seconds over 19 cloud test runs). A list page holds up to 100 products.
- A sort order or a price, stock, shipping or rating filter reads every page of the chosen selection first, because the site cannot sort or filter those server side. Reading the whole catalog that way takes about 4.5 minutes. **Maximum list pages per category** (default 120) bounds it.
- The site serves at most 10,000 products per address. Search mode splits `/todos` (11,865) and `/pneus` (11,510) into their groups, which hold 11,860 and 11,508 products. Five products belong to no group and can only be found by search text, product number or address.
- Only public pages are read: product, category and brand pages. Reviews text, the store locator and checkout are not covered.

### 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 pneustore.com.br (Brazil) tires, wheels and accessories into typed rows with PIX price in BRL, stock, rating, tire size, load and speed codes, Inmetro label, EAN and compatible vehicles. Also returns category and brand summaries and price-change alerts.

**Example agent prompt:** "Find the 10 cheapest Pirelli motorcycle tires in stock on pneustore.com.br." The agent sends `{ "mode": "search", "categories": ["/pneus/pneus-de-moto"], "brands": ["Pirelli"], "inStockOnly": true, "sort": "price-asc", "maxItems": 10 }` and reads the rows.

### 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.

### Business use cases

Dealers and distributors watch competitor prices, discounts and stock by brand and size. Fleet buyers compare truck, bus and OTR tire prices across brands. Price comparison sites load a BRL feed with EAN, brand and size. Analysts measure brand share, discount depth and rating by category. Monitor mode turns any saved search into a price alert.

### Frequently Asked Questions

#### What data can I scrape from pneustore.com.br?

Products of the whole catalog: car, SUV, van, motorcycle, truck and bus, OTR, farm, bicycle and quad bike tires, wheels, inner tubes and accessories, plus category and brand summaries. Each product has price, installments, stock, rating and, with product pages on, the full specification, EAN, stock quantity and compatible vehicles.

#### How do I scrape tire prices for one size or brand?

Set **Tire sizes** (for example `205/55R16`) and **Brands** (for example `Michelin`) in search mode. Several values in one field are combined with OR, different fields are combined with AND. A size the site does not sell returns no rows and a clear message in the log.

#### Which price does the `price` field hold?

The PIX price, the one the site shows first. `listPrice` is the price before the PIX discount, and `installments` with `monthlyPayment` describe the card plan. All amounts are in Brazilian reais (BRL).

#### Why does an out-of-stock product still have a price?

The site hides the price of sold-out products on the page but keeps it in its data. The Actor returns it and sets `inStock: false`. Turn on **Only products in stock** to drop them.

#### How many products can one run return?

All of them. The whole catalog has 11,865 products and search mode reaches 11,860 by reading the product groups of the big addresses. The 5 others come through search text, product number or address. Set **Maximum items** to the number you need.

#### Why is a sorted or price-filtered run slower?

The site cannot sort or filter by price on the server, so the Actor loads every page of the selection and then sorts. A single category takes seconds to minutes, the whole catalog about 4.5 minutes. Lower **Maximum list pages per category** to stay shallow.

#### How do I get only new products or price changes?

Turn on **Only new products** with a **Monitor name**. Later runs return only unseen products, and with **Report price changes** a product whose price moved comes back as a `price-change` row. Use one name per saved search.

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

No. pneustore.com.br answered every test request from Apify servers without a proxy once the request carries normal browser headers, which the Actor sets. You only need your Apify account.

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

Invalid input, for example a price range where the minimum is higher than the maximum, ends the run as succeeded with one free error row that explains the fix. A valid search with no matches ends with no rows and a message in the log. Neither is charged.

#### What do free plans get?

Free plans return up to 10 items per run, 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, so exports line up between runs.

#### Is it legal to scrape pneustore.com.br?

The Actor reads public product pages only and returns commercial data (prices, specifications, stock). No personal data is collected. robots.txt allows these pages. Use the data under the site terms and the laws that apply to you.

### Recommended Actors

- [RecordsData collection](https://apify.com/RecordsData): other e-commerce, automotive 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:** This is an independent tool and is not affiliated with, endorsed by or sponsored by PneuStore or its owner. PneuStore is a trademark of its owner. It collects only publicly available data.

# Actor input Schema

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

search = products of the categories and filters below. urls = the product, category or brand addresses and product numbers you list. categories = one summary row per category (product count, price range, brands, rim sizes). brands = one summary row per brand (product count per product group, price range, rim sizes).

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

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

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

Words that must appear in the product title, for example "michelin primacy", "camara de ar" or a size such as 205/55R16. A product number also works. Empty means no text filter.

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

Which part of the catalog to read. Empty reads the whole catalog. In categories mode, empty gives a summary row for every category.

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

Brand names as shown on the site, for example Michelin, Pirelli, General Tire, Speedmax. Not case sensitive. In search mode they filter the products; in brands mode they pick the summary rows (empty means every brand).

## `tireSizes` (type: `array`):

Exact tire sizes, for example 205/55R16, 195/55R16, 110/90-17 or 295/80R22.5. Several sizes are combined with OR.

## `rimSizes` (type: `array`):

Rim diameter ("Aro") in inches, for example 15, 16, 17.5 or 22.5.

## `terrainTypes` (type: `array`):

Tread use. HT, AT, MT, RT and Semi Slick are car and SUV tires; Highway, Regional, Mixed, Urban and Off-road are truck and bus tires.

## `treadDesigns` (type: `array`):

Asymmetric, symmetric or directional tread pattern.

## `runFlat` (type: `string`):

Keep only run flat tires, only regular tires, or both.

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

Only products priced at or above this amount in reais (the PIX price shown first). Applied by the actor. Leave empty for no limit.

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

Only products priced at or below this amount in reais. Leave empty for no limit.

## `inStockOnly` (type: `boolean`):

Drops products the site shows as out of stock (they keep their price on the site).

## `freeShippingOnly` (type: `boolean`):

Keep only products with the free shipping flag.

## `minRating` (type: `number`):

Only products with an average customer rating of at least this value (0 to 5).

## `sort` (type: `string`):

Order of the rows. Relevance is the site order. Any other order reads all pages of the selection first.

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

Each list page holds up to 100 products. Raise it to read very large categories, lower it to stay shallow.

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

urls mode: product pages (pneustore.com.br/pneu-...-10120084), category pages (with or without filters, for example https://www.pneustore.com.br/pneus/pneus-de-moto/trail?Marca=Pirelli) and brand pages (pneustore.com.br/marca/michelin).

## `productIds` (type: `array`):

urls mode: PneuStore product numbers (6 to 9 digits, the number at the end of a product address).

## `scrapeDetails` (type: `boolean`):

On: open each product page for the full specification, EAN, stock quantity, description and vehicle fitment (tire-detail-record). Off: list data only, much faster (tire-record).

## `includeFitment` (type: `boolean`):

With product pages: add the list of compatible cars (make, model, years, versions) when the site has one.

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

Adds the untouched site data of each product in a raw field. Larger rows, mostly for debugging.

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

Skips every product seen in an earlier run with the same monitor name, so scheduled runs return only what is new. Works in search and urls mode.

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

Needs Only new products. A product seen before with a different price comes back as price-change-record with the previous price and the change in percent.

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

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

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

Clears the memory of the monitor name before this run.

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

How many product pages are fetched at the same time (1 to 8). 4 is polite and fast.

## `proxyConfiguration` (type: `object`):

Optional. Empty means direct requests, which work. Add a proxy only if your own network needs one.

## Actor input object example

```json
{
  "mode": "search",
  "maxItems": 10,
  "searchQuery": "",
  "categories": [
    "/pneus/pneus-de-carro"
  ],
  "brands": [],
  "tireSizes": [],
  "rimSizes": [],
  "terrainTypes": [],
  "treadDesigns": [],
  "runFlat": "any",
  "inStockOnly": false,
  "freeShippingOnly": false,
  "sort": "relevance",
  "maxSearchPages": 120,
  "startUrls": [
    "https://www.pneustore.com.br/pneu-continental-aro-16-powercontact-2-195-55r16-87h-10120084"
  ],
  "productIds": [],
  "scrapeDetails": false,
  "includeFitment": true,
  "includeRaw": false,
  "onlyNew": false,
  "trackPriceChanges": false,
  "stateKey": "",
  "resetSeen": false,
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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": [
        "/pneus/pneus-de-carro"
    ],
    "brands": [],
    "tireSizes": [],
    "rimSizes": [],
    "minPrice": 0,
    "maxPrice": 0,
    "minRating": 0,
    "startUrls": [
        "https://www.pneustore.com.br/pneu-continental-aro-16-powercontact-2-195-55r16-87h-10120084"
    ],
    "productIds": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/pneustore-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": ["/pneus/pneus-de-carro"],
    "brands": [],
    "tireSizes": [],
    "rimSizes": [],
    "minPrice": 0,
    "maxPrice": 0,
    "minRating": 0,
    "startUrls": ["https://www.pneustore.com.br/pneu-continental-aro-16-powercontact-2-195-55r16-87h-10120084"],
    "productIds": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/pneustore-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": [
    "/pneus/pneus-de-carro"
  ],
  "brands": [],
  "tireSizes": [],
  "rimSizes": [],
  "minPrice": 0,
  "maxPrice": 0,
  "minRating": 0,
  "startUrls": [
    "https://www.pneustore.com.br/pneu-continental-aro-16-powercontact-2-195-55r16-87h-10120084"
  ],
  "productIds": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call recordsdata/pneustore-scraper --silent --output-dataset

```

## MCP server setup

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