# Magalu Scraper - Magazine Luiza Prices, Pix & Sellers (`scrapewise/magalu-produtos`) Actor

Scrape Magazine Luiza (Magalu, Brazil) products from searches, categories, seller stores or product links: price, Pix price, installments, list price, seller, rating, reviews, stock and position. Optional product page with full specs and variants. Price tracking for schedules. Error rows are free.

- **URL**: https://apify.com/scrapewise/magalu-produtos.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (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 $2.55 / 1,000 product delivereds

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

## Magalu Scraper: Magazine Luiza prices, Pix price, installments and sellers

Scrape [Magazine Luiza](https://www.magazineluiza.com.br) (Magalu), one of Brazil's largest retailers and
marketplaces, **without an account**. Type a search term or paste a search or category URL, add brand, seller and
price filters, or paste product links. Every product comes with the card price, the **Pix price**, the best
**installment plan**, the list price and discount, the seller, rating and review count, stock and its **position in
the results**.

Turn on the full product page and you also get the description, the **full specifications sheet**, reference and
model, the category path, every variant (color, voltage, size...) with its stock, all images, dimensions and weight,
and the 1 to 5 star rating distribution.

Built for **price monitoring**: schedule the same search every day and get only the products that are new, or whose
price changed, with the previous price and the change in reais and percent. A quiet day costs nothing.

### What it fixes

- **A search with no match says so.** When Magalu has nothing for a term it shows a generic showcase of hundreds of
  unrelated products; this Actor detects it and returns a free `NO_RESULTS` row instead of charging you for them.
- **Price filters at the source.** `minPrice` / `maxPrice` go into Magalu's own filter, so the product limit counts only
  products in your range and nothing outside it is read or charged.
- **Pix and installments on every row,** not only on the product page: `pixPrice`, `pixDiscountPct`, `installments`,
  `installmentAmount` and whether they are interest-free.
- **Your limits are respected.** A `maxItems` pasted from another Magalu actor where it caps the whole run caps the
  whole run here too; `maxPages`, `max_items_per_url` and `limit` also work.
- **Passes Magalu's Akamai protection** on the cheap datacenter proxy, with a fresh IP when one is refused. No proxy
  setup on your side.

### At a glance

- **Price per 1,000 products, Free plan:** US$ 3.00
- **Full product page (optional):** US$ 3.00 per 1,000, on top
- **Fee per run start:** US$ 0.005 (covers the browser session that passes Magalu's protection)
- **Search terms, search URLs, category URLs and product links:** Yes
- **Card price, Pix price, installments and list price on every row:** Yes
- **Magalu's own sort orders (best sellers, price, rating, newest, shipping):** Yes
- **Brand, seller and price filters:** Yes, with the site's own filters
- **Minimum rating and leaving out sponsored products:** Yes
- **Cap for the whole run (`maxTotalItems`):** Yes
- **Position in the results on every row:** Yes, ranking tracking out of the box
- **Only new products since the last run (`onlyNew`):** Yes, free when nothing is new
- **Price tracking between runs (`trackPriceChanges`, `onlyPriceDrops`):** Yes
- **Error rows (bad URL, no results, site refusal):** Free, with an `errorCode`

### One real row

From a test on 2026-10-08 (search "geladeira frost free", sold by Magalu, best sellers first, with the product
page), shortened to four specifications, one variant and two images:

```json
{
  "type": "product",
  "productId": "242454900",
  "title": "Geladeira/Refrigerador Brastemp Frost Free French Door Inox 630L BRO88AK Bivolt",
  "brand": "Brastemp",
  "url": "https://www.magazineluiza.com.br/geladeira-refrigerador-brastemp-frost-free-french-door-inox-630l-bro88ak-bivolt/p/242454900/ed/refr/",
  "price": 6889,
  "originalPrice": 8959,
  "discountPct": 23,
  "pixPrice": 6544.55,
  "pixDiscountPct": 5,
  "bestPaymentMethod": "no Pix",
  "installments": 10,
  "installmentAmount": 688.9,
  "installmentInterestFree": true,
  "currency": "BRL",
  "inStock": true,
  "sellerId": "magazineluiza",
  "sellerName": "Magalu",
  "soldByMagalu": true,
  "category": "Eletrodomésticos",
  "subcategory": "Geladeira / Refrigerador",
  "image": "https://a-static.mlcdn.com.br/800x560/geladeira-refrigerador-brastemp-frost-free-french-door-inox-630l-bro88ak-bivolt/magazineluiza/242454900/544b81f3828f44db112d57b26bb5cbb5.jpg",
  "attributes": {"Cor": "Inox", "Voltagem": "Bivolt"},
  "magaluRecommends": true,
  "isSponsored": false,
  "position": 1,
  "page": 1,
  "searchInput": "geladeira frost free",
  "hasDetails": true,
  "specifications": {
    "Marca": "Brastemp",
    "Referência": "BRO88AKXNA",
    "Tipo": "French door",
    "Modelo": "BRO88AK"
  },
  "reference": "BRO88AKXNA",
  "model": "BRO88AK",
  "categoryPath": "Eletrodomésticos > Geladeira / Refrigerador",
  "dimensionsM": {"width": 0.871, "height": 2.003, "depth": 0.813},
  "weightKg": 100,
  "variants": [
    {"variationId": "242454900", "attribute": "Cor", "value": "Inox", "inStock": true}
  ],
  "scrapedAt": "2026-10-08T01:28:36Z"
}
```

Rows also carry `rating` and `reviewCount` (empty when the product has no review yet), `variantCount`, `badges`,
`categoryId`, `subcategoryId` and, with the product page, `description`, `images`, `videos`, `productType`,
`ratingDistribution` and `commentCount`.

### How to use it

**By search term.** Type one or more terms, the way you would on the site:

```json
{
  "searchTerms": ["air fryer", "smart tv 55"],
  "sortBy": "bestSellers",
  "maxItems": 100
}
```

**By URL.** Open Magalu, run a search or open a category, set the sort order, and paste the address:

```json
{
  "startUrls": [
    "https://www.magazineluiza.com.br/busca/air+fryer/",
    "https://www.magazineluiza.com.br/celulares-e-smartphones/l/te/"
  ],
  "maxItems": 200
}
```

**By product link.** Paste product URLs (they contain `/p/` and a code). Each comes back with the full product page:

```json
{
  "startUrls": ["https://www.magazineluiza.com.br/apple-iphone-17e-256gb-preto-61-48mp-ios-5g/p/241439100/te/i17e/"]
}
```

**Filters** work with search terms and search URLs: `"brands": ["Samsung", "LG"]`, `"sellers": ["magazineluiza"]`,
`"minPrice": 2000`, `"maxPrice": 5000` (Brazilian reais). They use Magalu's own filters, so the limit counts only
matching products. Each brand and each seller runs as its own search.

**A seller's whole catalog.** Put the seller ID from its store URL (`/lojista/<id>/`) in `sellers` and search a broad
term for its category. Use `magazineluiza` for products sold by Magalu itself. This is the way to watch a competitor's
prices on Magalu.

### Daily price monitoring

Schedule the Actor with the same input every day and turn on:

- **`onlyNew`**: only products this search never returned before. The first run delivers up to `maxItems` and
  remembers everything it read; later runs deliver only what is new. Products already seen are not charged.
- **`trackPriceChanges`**: every row gets `previousPrice`, `priceChange`, `priceChangePct`, `isPriceDrop`,
  `isNewProduct`, `firstSeenAt` and `previousSeenAt`, compared with your earlier runs of the same search. With
  `onlyNew` on too, products whose price changed are delivered as well.
- **`onlyPriceDrops`**: with both of the above, of the products seen before, only the ones that got cheaper.

The memory lives in a key-value store in your own account (`magalu-scraper-state`), one entry per search and
filters. Delete it to start over.

### Switching from another Magalu actor? Your existing input works

Paste the input you already use. These names and values are read as they are:

| You may already send | Read as |
|---|---|
| `keyword`, `term`, `searchTerms`, `queries` | search terms |
| `startUrls`, `urls` (search, category or product links) | links |
| `maxItems` together with `maxPages`, `fetchFullDetail`, `includeSponsored` or `term` | cap for the whole run (`maxTotalItems`), as in those actors |
| `maxPages` | at most 40 products per page per search |
| `max_items_per_url`, `limit` | `maxItems` (per search) |
| `startPage`, `page` | starts reading at that results page |
| `sortBy`: `relevance`, `price_asc`, `price_desc`, `best_selling`, `best_rated`, `newest` | `sortBy` |
| `sort_by`: `score`, `price`, `soldQuantity`, `review`, `releaseDate`, `shippingTime` | `sortBy` |
| `minPrice`, `maxPrice`, `price_range` (`"1500-4000"`) | price filter (reais) |
| `rating` (`1` to `5`) | `minRating` |
| `fetchFullDetail` | `includeDetails` |
| `includeSponsored: false` | `excludeSponsored` |
| `rawQueryParams` (`"sortType=price&sortOrientation=asc"`) | added to the search URL |
| `failOnNoResults` | the run fails when nothing is delivered |
| `proxyConfiguration: {"useApifyProxy": false}` | the default Apify Proxy, so a refused IP can be swapped |

`requestTimeoutSecs`, `retries`, `maxRuntimeSecs` and `ignore_url_failures` are handled automatically and ignored.

### Who uses this

- **Brands and distributors** checking how resellers price their products on Magalu's marketplace.
- **Sellers on Magalu** tracking competitors' prices, Pix discounts and ranking for their key searches.
- **Price comparison and deal sites** that need fresh Brazilian prices with the Pix and installment conditions.
- **Market researchers** measuring assortment, average prices and review counts by category or brand in Brazil.

### Limits and good to know

- Magalu shows **40 products per page and at most 25 pages (1,000 products) per search**. For more, split the
  search by brand, seller or price range.
- Prices are in **Brazilian reais (BRL)**. `price` is the card price, `pixPrice` the price paid by Pix (usually
  lower), `originalPrice` the list price before discount.
- Product names, categories and specifications come in Portuguese, exactly as Magalu publishes them.
- Brand, seller and price filters apply to search terms and search URLs. Category URLs run exactly as pasted.
- A seller's store URL (`/lojista/<id>/`) returns the seller's whole catalog (up to 1,000 products, 25 pages), read
  from Magalu's search service. Category URLs work the same way.
- The barcode (EAN) is not on Magalu's public pages, so it is not in the output.
- Search terms, search URLs, category URLs and seller URLs are read from the same search service the Magalu site uses,
  with no browser, so they are fast and rarely refused. Product pages (product links and `includeDetails`) sit behind
  Akamai: the Actor opens a session once
  in a real browser and then reads pages with plain HTTP on the same IP, with the default datacenter proxy. A refused IP is dropped and
  another one is tried. If Magalu keeps refusing (it sometimes closes the door for a few minutes), the run stops early
  and you get a free `BLOCKED` row; run again in a few minutes. A search URL that comes back without its product
  list is read once more on the open session, and if it still has no list it is reported as `BLOCKED`, not as an
  input error.

### Pricing

Pay per product: **US$ 3.00 per 1,000 products** on the Free plan (lower on paid Apify plans), plus **US$ 3.00 per
1,000** for products delivered with the full product page, and US$ 0.005 per run start. Error rows, duplicates, products
skipped by `onlyNew`, `onlyPriceDrops`, `onlyInStock`, `minRating` or `excludeSponsored` are never charged.

### Error codes

| errorCode | Meaning |
|---|---|
| `INVALID_INPUT` | The URL is not a Magalu search, category or product link, or a category/seller page has no product list |
| `NO_RESULTS` | Magalu found no product for this search and filters |
| `NOT_FOUND` | The page or product does not exist (removed or a wrong link) |
| `BLOCKED` | The site refused every attempt on fresh IPs; run again in a few minutes |
| `NOT_REACHED` | The run timeout came before this input |
| `UNEXPECTED` | Anything else; run again, and open an issue if it repeats |

### FAQ

**Do I need a Magalu account?** No. The Actor reads public pages only.

**Can I get the reviews' text?** Not in this version. Rating, review count and, with the product page, the star
distribution are included.

**Does it follow my sort order?** Yes. Pick it in `sortBy`, or paste a URL already sorted on the site.

**How fresh is the data?** It is read live from Magalu at run time.

### Changelog

- **18 Oct 2026:** searches, category URLs and seller URLs are read from Magalu's own search service, with no
  browser: faster runs and far fewer `BLOCKED` rows. Seller URLs now return the whole catalog, not only the 10
  storefront products. A search page that comes back without its product list is reported as `BLOCKED`, not as
  `INVALID_INPUT`.

# Actor input Schema

## `searchTerms` (type: `array`):

Words to search on Magazine Luiza, one per line, as you would type them on the site (for example air fryer, iphone 16, geladeira frost free). Portuguese works best. Leave empty to use only the URLs below.

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

Search or category URLs copied from your browser after setting the filters on magazineluiza.com.br (for example https://www.magazineluiza.com.br/busca/air+fryer/ or https://www.magazineluiza.com.br/celulares-e-smartphones/l/te/), one per line. Filters and sort order in the URL are kept. Product URLs (with /p/<code>/) also work and come back with the full product page. A seller's store URL (/lojista/<id>/) returns the seller's whole catalog.

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

Keep only these brands, one per line (for example Samsung, LG, Electrolux). Uses Magalu's own brand filter; each brand runs as its own search, so the limit applies per brand. Applies to search terms and /busca/ URLs; category and store URLs run as pasted.

## `sellers` (type: `array`):

Keep only products sold by these Magalu sellers, one per line: the seller ID from the store URL (for example mideacarrier from https://www.magazineluiza.com.br/lojista/mideacarrier/) or the store URL itself. Combine with search terms to read a seller's catalog or watch a competitor's prices. Use magazineluiza for products sold by Magalu itself. Each seller runs as its own search.

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

Only products at or above this price in Brazilian reais. Uses Magalu's own price filter. Applies to search terms and /busca/ URLs.

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

Only products at or below this price in Brazilian reais.

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

Magalu's own orders. With a product limit it also decides which products you get. Position in the results is saved on every row, so 'Relevance' doubles as a ranking tracker.

## `onlyInStock` (type: `boolean`):

Skip products that cannot be bought right now. Skipped products are not charged.

## `minRating` (type: `string`):

Keep only products rated at or above this many stars. Products without reviews are skipped too. Skipped products are not charged. Empty = any rating.

## `excludeSponsored` (type: `boolean`):

Magalu mixes paid placements into its results. They are kept by default and flagged with isSponsored; turn this on to leave them out (not charged).

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

Stop each search (each term, URL or brand) after this many products. Magalu shows 40 per page and at most 25 pages (1,000 products) per search. 0 = up to 1,000.

## `maxTotalItems` (type: `integer`):

Optional cap for the whole run, across every term, URL and brand (maxItems is per search). Also works as a spend cap. Empty = no cap.

## `includeDetails` (type: `boolean`):

Also open each product's own page: description, the full specifications sheet, reference and model, category path, every variant (color, size, voltage...) with its stock, all images, dimensions and weight, and the 1 to 5 star rating distribution. Charged as a second event per product.

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

For scheduled runs. Remembers which products each search (with its filters) already returned, in a named key-value store in your account ('magalu-scraper-state'), and delivers only products not seen before. The first run delivers up to the limit and marks everything it read as seen. Seen products are not delivered and not charged. Forces the newest-first order. Delete the store to start over.

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

Compares each product's price with the price seen in your previous runs of the same search (same key-value store) and adds previousPrice, priceChange, priceChangePct, isPriceDrop, isNewProduct, firstSeenAt and previousSeenAt. With 'Only new products' on too, products whose price changed are delivered as well.

## `onlyPriceDrops` (type: `boolean`):

With 'Only new products' and 'Track price changes' both on: of the products seen before, deliver only those whose price went down.

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

Searches, categories and seller URLs go through Magalu's own search service with no browser. Product pages sit behind Akamai: the Actor opens a session in a real browser, then reads pages with plain HTTP on the same IP, so the cheap datacenter proxy (the default) works. If you get BLOCKED rows, run again in a few minutes.

## Actor input object example

```json
{
  "searchTerms": [
    "air fryer"
  ],
  "sortBy": "relevance",
  "onlyInStock": false,
  "excludeSponsored": false,
  "maxItems": 20,
  "includeDetails": false,
  "onlyNew": false,
  "trackPriceChanges": false,
  "onlyPriceDrops": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `resultsCsv` (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 = {
    "searchTerms": [
        "air fryer"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/magalu-produtos").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 = {
    "searchTerms": ["air fryer"],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/magalu-produtos").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 '{
  "searchTerms": [
    "air fryer"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/magalu-produtos --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/magalu-produtos"
        }
    }
}
```

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/gt3dsjOslG0TrylE5/builds/18f1Q6X1mNFqX0sJi/openapi.json
