Casas Bahia Brazil Electronics & Home Goods Scraper avatar

Casas Bahia Brazil Electronics & Home Goods Scraper

Pricing

from $1.00 / 1,000 product results

Go to Apify Store
Casas Bahia Brazil Electronics & Home Goods Scraper

Casas Bahia Brazil Electronics & Home Goods Scraper

Scrape products from Casas Bahia Brazil by keyword, department, or URL. Filter by brand, price, discount, rating, and instalment terms. Extract SKUs, titles, brands, current and original prices, Pix offers, BRL instalment plans, stock, pickup options, images, variants, specifications, and reviews.

Pricing

from $1.00 / 1,000 product results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Casas Bahia Scraper: Prices, Pix Discounts, Instalments & Reviews

Casas Bahia Scraper turns the Casas Bahia catalogue (casasbahia.com.br) into a clean product data feed. Get one flat row per product variant: identity, live price, the pre-discount price and discount, the instant-payment (Pix) price, the instalment terms, stock and pickup signals, media, variants, specifications and customer reviews, all in Brazilian reais. Search by keyword and department, or paste product, department and search links, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

Why This Scraper?

  • Two ways to find products. Search by keyword and the store's own filters, or paste product links, department links, search-result links or bare product codes.
  • Real price plus Pix. Every row carries the live price, the pre-discount price and discount, and the instant-payment (Pix) price when the store offers one, not just a single headline number.
  • Every instalment plan. Instalment text, count and value, whether it is interest free, and the full list of instalment options the store publishes.
  • Full product depth on demand. Description, specification table, colour and capacity variants, manufacturer and warranty information, the full media gallery and customer reviews, all read from the product's own page.
  • Reviews at no extra cost. Rating, review count, the per-star breakdown and individual review rows come from the same page read as the description and specifications.
  • Store filters plus actor filters. Department, brand, price band, minimum discount and minimum rating are applied by the store itself; minimum instalments, interest-free-only and in-stock-only are applied by this actor after reading each product's own terms.
  • Built for monitoring. Resume one interrupted run without paying twice, or turn on incremental mode to get only new, updated and reappeared products on a recurring schedule.

Use Cases

  • Price monitoring and repricing: track price cuts, Pix discounts and stock changes across a department or a brand on a schedule.
  • Comparison shopping and marketplace tools: pull structured price, instalment and availability data to power a comparison page or app.
  • Market research and BI: build a historical BRL price and discount dataset for electronics and home goods.
  • Review and sentiment analysis: collect rating breakdowns and individual review text to understand customer feedback at scale.
  • Content and affiliate teams: source specifications, images and instalment terms for buying guides and product pages.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
productId (SKU) / productGroupId"1234567890" / "9876543210"
title / baseTitle / variantName"Refrigerator Example 400L Frost Free"
brand / brandId"Example Brand" / "42"
ean"7890000000000"
url"https://www.casasbahia.com.br/exemplo-produto/p/1234567890"
categoryName / categoryPath / categoryIds"Refrigerators" / ["Home Appliances", "Refrigerators"] / ["13", "14"]
price / originalPrice / discountPercent / discountAmount / listPrice3499.90 / 4299.90 / 19 / 800.00 / 4599.90
currency (BRL) / onSale"BRL" / true
cashPrice / cashPriceLabel / cashDiscountPercent / hasPixDiscount / hasBoletoDiscount3149.91 / "No Pix" / 10 / true / false
installmentText / installmentCount / installmentValue / installmentInterestFree"10x de R$ 349,99 sem juros" / 10 / 349.99 / true
installmentOptions[]list of plans, each with type, count, installmentValue, monthlyInterest, totalPrice, interestFree
inStock / availabilitytrue / { "national": true, "regional": true, "commercial": false }
pickupInStore / deliveryEstimate / shippingCosttrue / null / null (see the note below the table)
sellerId / sellerName / sellerCount / offerCount / minOfferPrice / maxOfferPrice"1" / "Casas Bahia" / 3 / 3 / 3149.91 / 3699.90
image / images[] / videos[] / manuals[]cover image, full gallery, product videos, manual documents
variantOptions[] / variants[]for example Colour and Capacity, with each sibling's own id, name, image, url and availability
description / specifications[] / highlights[] / warrantyfull text, { group, name, value } rows, bullet highlights, "12 months"
manufacturerName / manufacturerContact / manufacturerSupportUrl"Example Brand" / "0800 000 0000" / "https://support.example.invalid"
rating / reviewCount / ratingBreakdown[] / recommendationPercentage4.7 / 128 / five-row breakdown / 92
reviewSummary / reviewsAvailable / reviews[]store's own written summary / true / individual rows: author, date, rating, text, helpful counts
sponsored / productOrigin / searchMode / scrapedAtfalse / "Nacional" / "search" / "2026-08-28T00:00:00Z"
changeType / changedFields / firstSeenAt / lastSeenAtincremental mode only: "UPDATED" / ["price", "discountPercent"] / timestamps

Casas Bahia is a Brazil-only retailer: one storefront, one currency (BRL) and one language (pt-BR), with no country or locale switch anywhere on the site, so there is no country input to configure.

deliveryEstimate and shippingCost are always null. Casas Bahia quotes delivery windows and freight only against a customer postal code entered on the product page, so with no postal code the page's own freight panel is empty and there is no anonymous shipping figure to read. What the store does publish without one, pickupInStore and availability, is captured in full.

How to Use

  1. Pick a mode: search (by keyword and filters) or url (paste links or product codes).
  2. Fill in the fields for that mode: keywords and department filters for search, or links and codes for url.
  3. Switch Fetch product details and Include customer reviews on or off, and set Max products to control run size and cost.
  4. Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.

Search by keyword:

{
"mode": "search",
"queries": ["geladeira"],
"maxItems": 20
}

Search a department, filtered by brand and discount, cheapest first:

{
"mode": "search",
"categories": ["c13"],
"brands": ["Consul"],
"minDiscountPercent": 20,
"sortBy": "price_asc",
"maxItems": 50
}

Paste a product link and a department link:

{
"mode": "url",
"urls": [
"https://www.casasbahia.com.br/exemplo-produto-generico/p/1234567890",
"https://www.casasbahia.com.br/c/eletrodomesticos?filtro=categoria-c13"
]
}

Lightweight listing-only run (price and stock, no detail page read):

{
"mode": "search",
"queries": ["notebook"],
"fetchDetails": false,
"includeReviews": false,
"maxItems": 100
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/casasbahia-com-br-scraper").call(
run_input={"mode": "search", "queries": ["geladeira"], "maxItems": 20})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
print(product["title"], product["price"], product["currency"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/casasbahia-com-br-scraper').call({
mode: 'search', queries: ['geladeira'], maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Reviews cost no extra request

Reviews are returned by default. Each product carries an average rating, a reviewCount, a five-row ratingBreakdown, the share of reviewers who recommend the product, the store's own written summary, and individual review rows: author, date, rating, text and helpful counts. Shopper-uploaded review photos and clips are not returned. Reviews come from the same product page as the description and specifications, so includeReviews adds nothing to the request count once fetchDetails is on. A product with no reviews returns reviews: [], reviewCount: 0 and rating: null, nothing is invented. maxReviewsPerProduct caps only the individual rows returned; the average, count and per-star breakdown are always complete.

Connection

The default is the standard connection pool, which is enough for catalogue search, pricing and product pages. This store refuses individual connections from time to time rather than whole pools, and a refused request is retried on a fresh connection automatically. If refusals persist, switch to the residential proxy group with country BR, which usually clears them but costs considerably more. If a run cannot read any results at all, it fails loudly with that explanation rather than reporting an empty search.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted run: paste its run or dataset ID and products already collected there are skipped, not re-returned and not re-billed.
  • Incremental mode (incrementalMode) is for recurring monitoring of the same search. The first run returns everything as NEW; later runs return only NEW, UPDATED and REAPPEARED, which is how a price cut or a stock change shows up. Turn on emitUnchanged or emitExpired only when you also want those rows returned, and billed. stateKey names or shares a monitoring campaign; leave it empty and the actor derives one from the search, filters and detail settings.
  • reviews is excluded from the change fingerprint: a busy product would otherwise be marked UPDATED by every new review, and storing the whole review corpus would blow the size cap on the saved baseline. Change is still detected through reviewCount, rating and ratingBreakdown, which do appear in changedFields.

A known limit: Max products does not cap Emit expired rows. Max products bounds the new, updated, reappeared and unchanged rows a run returns. It currently does not bound EXPIRED rows: when emitExpired is on and a run completes a full scan of the tracked search, every previously tracked product no longer found is added to that run's output on top of the capped batch, so the total rows returned (and billed) can exceed Max products. This shows up on a large, long-running monitoring campaign where many tracked products have disappeared since the last run. If you need a hard ceiling on run size, turn emitExpired off, or budget for an occasional larger run when a lot of tracked products expire at once.

A known limit: combining Resume with a brand-new Incremental campaign. Resume from a previous run and Incremental mode can be combined only the first time Incremental mode is turned on for a state key (a state key that already has saved state refuses the combination and explains why). On that one allowed combined run, the resumed run's already-collected products are added to the new baseline as tracked but empty: Resume skips them, so their pages are never read and nothing about them is stored. That has two costs on the next Incremental run. First, every one of those products that is still on sale comes back as UPDATED, with every field listed in changedFields, and is returned and billed again even though nothing changed. Second, any of those products that disappears before a later run sees it again is never reported EXPIRED: the run log counts it as skipped, but no row is returned. Once a later run does see a product again, it is stored normally and tracked correctly from then on. To avoid both costs, finish an interrupted run with Resume alone first (Incremental mode off), then start a separate, fresh Incremental mode run once that pass is complete.

A known limit: several overlapping keywords in one run. Each keyword (or each pasted catalogue link) walks its own result pages and stops once a page returns nothing new. That check compares against every product id the whole run has returned so far, not only against that keyword's own previous page. When two keywords in the same run return overlapping products, a later keyword can land on a page made up entirely of products an earlier keyword already returned, and read that as the end of its own results, even though it has more new products on a later page. Those later products are missing from the run. With Incremental mode and emitExpired on, it is worse: the run still counts as a complete scan, so tracked products on those unread pages are returned (and billed) as EXPIRED although they are still on sale, and come back as REAPPEARED once a later run reaches them. Run one keyword (or one catalogue link) per run, each with its own state key, when you need the full depth of an overlapping search.

Notes and limits

  • The catalogue's page size is fixed at 20 rows by the store.
  • Some result rows are the store's own promoted placements, returned like any other product and flagged sponsored: true so you can drop them.
  • Search results are capped by the store itself at 10,000 rows per query; narrow with filters to go deeper than that.
  • maxItems defaults to 20. Set it to 0 for an uncapped run.
  • Sorting by price is the store's own ordering, applied to the price in its search index at index time; each row's price is read live, so a product whose price moved since the store last indexed it can appear slightly out of order.
  • No concurrency, retry or timeout knobs are exposed. Retries are capped internally, and a run that cannot read its pages fails fast rather than grinding.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (keyword and filters) or url (paste links or product codes).
queriesarray["geladeira"]Search keywords (search mode). Leave empty to browse by Department alone.
urlsarraysampleProduct links, department links, search links or bare product codes (url mode).
categoriesarray(none)Department filter. Applied by the store, in both modes.
brandsarray(none)Brand names, matched against the store's own brand list, ignoring case and accents.
minPriceinteger(none)Minimum price in BRL. Applied by the store.
maxPriceinteger(none)Maximum price in BRL. Applied by the store.
minDiscountPercentinteger(none)Minimum discount percentage off the pre-discount price. Applied by the store.
minRatingstring0Minimum average rating bucket (0 to 5 stars). Applied by the store.
minInstallmentsinteger(none)Keep only products offering at least one plan with this many instalments or more. Applied by this actor.
interestFreeInstallmentsOnlybooleanfalseKeep only products with at least one interest-free instalment plan. Applied by this actor.
inStockOnlybooleanfalseKeep only products the store will currently accept an order for. Applied by this actor.
sortBystringrelevancerelevance, popularity, best_selling, price_asc or price_desc. All five are the store's own orderings.
fetchDetailsbooleantrueRead each product's own page for description, specifications, variants, manufacturer info, gallery, pickup signal and instalment plans.
includeReviewsbooleantrueAdd customer reviews. Requires Fetch product details; costs no extra request.
maxReviewsPerProductinteger20Cap on individual review rows returned per product. 0 for every review the page publishes.
maxItemsinteger20Maximum products returned across the whole run. 0 for unlimited.
maxPagesinteger0Maximum result pages read per keyword or link. 0 for no limit.
resumeFromRunIdstring(none)Continue one interrupted run without re-returning or re-billing products already collected there.
incrementalModebooleanfalseReturn only new, updated and reappeared products on recurring runs over the same search.
stateKeystring(none)Name or share an incremental-mode monitoring campaign.
emitUnchangedbooleanfalseAlso return (and bill) products unchanged since the last run.
emitExpiredbooleanfalseAlso return (and bill) products no longer found, after a complete scan.
proxyobjectApify Proxy (standard)Connection settings.
mcpConnectorsarray(none)Optional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"productId": "1234567890",
"productGroupId": "9876543210",
"title": "Refrigerator Example 400L Frost Free",
"brand": "Example Brand",
"brandId": "42",
"ean": "7890000000000",
"url": "https://www.casasbahia.com.br/exemplo-produto/p/1234567890",
"categoryName": "Refrigerators",
"categoryPath": ["Home Appliances", "Refrigerators"],
"price": 3499.9,
"originalPrice": 4299.9,
"discountPercent": 19,
"discountAmount": 800.0,
"currency": "BRL",
"onSale": true,
"cashPrice": 3149.91,
"cashPriceLabel": "No Pix",
"hasPixDiscount": true,
"installmentText": "10x de R$ 349,99 sem juros",
"installmentCount": 10,
"installmentValue": 349.99,
"installmentInterestFree": true,
"inStock": true,
"availability": { "national": true, "regional": true, "commercial": false },
"pickupInStore": true,
"deliveryEstimate": null,
"shippingCost": null,
"sellerId": "1",
"sellerName": "Casas Bahia",
"image": "https://imgs.example.invalid/1234567890/1.jpg",
"variantOptions": [
{ "name": "Colour", "values": ["White", "Silver"] }
],
"specifications": [
{ "group": "General", "name": "Capacity", "value": "400 litres" }
],
"warranty": "12 months",
"rating": 4.7,
"reviewCount": 128,
"ratingBreakdown": [{ "rating": 5, "percentage": 78, "label": "Excellent" }],
"reviewsAvailable": true,
"reviews": [
{
"reviewId": "0000",
"author": "Sample Customer",
"date": "27/04/2026",
"rating": 5,
"text": "Sample review text.",
"helpfulCount": 3,
"notHelpfulCount": 0
}
],
"sponsored": false,
"searchMode": "search",
"scrapedAt": "2026-08-28T00:00:00Z"
}

Plan Requirement

The default proxy setting works out of the box, and the actor rotates connections automatically when one is refused. For large or frequent runs, the residential proxy group with country BR gives more headroom; pick it under Connection.

FAQ

How much does it cost?

You pay per product returned, plus a detail-enrichment surcharge when fetchDetails is on. The Pricing tab shows the current rates. Use Max products to cap the cost of any run.

This actor collects only publicly available product data. You are responsible for how you use it: follow Casas Bahia's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Prices, specifications and availability are generally facts, but product photos and manufacturer content may be subject to third-party rights.

Can I get only new or changed prices on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared products, and unchanged ones are not billed unless you turn emitUnchanged on.

Why are deliveryEstimate and shippingCost always null?

Casas Bahia only quotes delivery windows and freight against a customer postal code entered on the product page. With no postal code there is no anonymous shipping figure to read, so this is a property of the store, not a gap in this actor. pickupInStore and availability are captured in full.

Why did a run return more products than Max products?

Max products caps new, updated, reappeared and unchanged rows. It currently does not cap EXPIRED rows: with emitExpired on, a run that completes a full scan of the tracked search adds every previously tracked product no longer found on top of the capped batch. Turn emitExpired off if you need a hard ceiling on run size.

Why did my run fail instead of returning an empty dataset?

If the site refuses every request, the run stops with a clear message so "no products matched" is never confused with "nothing could be read". Run it again in a few minutes, or check the Connection section if it keeps happening.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

🔗 Want more electronics data?

Pair this actor with these related scrapers from the same team:

🛒 Americanas Brazil
Scrape Americanas Brazil (americanas.com.br) by keyword, department or pasted link...
🔌 PB Tech Scraper
Scrape pbtech.co.nz products with full specifications, price, brand, condition, per-store...
🛒 Netshoes Brazil
Scrape sportswear and footwear from netshoes.com.br. Search by keyword with the store's...
🔌 Boulanger.com
Scrape Boulanger (boulanger.com) electronics and home-appliance products: current price...
🔌 Yodobashi Scraper
Scrape yodobashi.com electronics and appliances: JPY price, list price and discount...
🔌 Bic Camera Scraper
Scrape Bic Camera (biccamera.com) products: JPY price, list price and discount, Bic Point...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.