Casas Bahia Brazil Electronics & Home Goods Scraper
Pricing
from $1.00 / 1,000 product results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Scrape the Casas Bahia catalogue (casasbahia.com.br) and get one clean, 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. Everything in Brazilian reais.
Two ways to use it:
- Search by keyword and/or department, with the store's own filters (department, brand, price band, minimum discount, minimum rating) and its own sort orders.
- URL mode: paste product links, department links, search-result links or bare product codes. Product links are fetched in full; catalogue links are walked forward page by page.
Country scope
Casas Bahia is a Brazil-only retailer. It publishes one storefront, one currency (BRL) and one language (pt-BR); there is no country, market or locale switch anywhere on the site, and no alternate-market address resolves. Verified live before this actor was built, which is why there is no country input: a picker with one working value would only be misleading.
What you get
| Group | Fields |
|---|---|
| Identity | productId (SKU), productGroupId, title, baseTitle, variantName, brand, brandId, ean, url, categoryName, categoryPath, categoryIds |
| Price | price, originalPrice, discountPercent, discountAmount, listPrice, onSale, currency (BRL) |
| Instant payment | cashPrice, cashPriceLabel (for example No Pix), cashDiscountPercent, hasPixDiscount, hasBoletoDiscount |
| Instalments | installmentText (for example 12x de R$324,99 sem juros), installmentCount, installmentValue, installmentInterestFree, installmentOptions[] with type, count, installmentValue, monthlyInterest, totalPrice, interestFree |
| Availability | inStock, availability (national, regional, commercial), pickupInStore, deliveryEstimate, shippingCost |
| Seller | sellerId, sellerName, sellerCount, offerCount, minOfferPrice, maxOfferPrice |
| Media | image, images[], videos[], manuals[] |
| Variants | variantOptions[] (for example Colour, Model, Storage with their values) and variants[] with productId, name, attributes, image, url, available, selected |
| Details | description, specifications[] (group, name, value), highlights[], warranty, manufacturerName, manufacturerContact, manufacturerSupportUrl |
| Reviews | rating, reviewCount, ratingBreakdown[], recommendationPercentage, reviewSummary, reviewsAvailable, reviews[] |
| Bookkeeping | sponsored, productOrigin, searchMode, scrapedAt |
| Incremental mode | changeType, changedFields, firstSeenAt, lastSeenAt |
Reviews
Reviews are a real, fully available feature on this store and are returned by default.
Each product carries an average rating, a reviewCount, a five-row ratingBreakdown, the
share of reviewers who recommend the product (recommendationPercentage), the store's own
written summary (reviewSummary), and the individual review rows the product page publishes:
author, date, rating, text, helpful and not-helpful counts. Shopper-uploaded review photos
and clips are not returned. Reviews cost no extra request: they come from the same product page as the
description and specifications, so includeReviews is free once fetchDetails is on.
A product with no reviews returns reviews: [], reviewCount: 0, rating: null and
reviewsAvailable: false. Nothing is invented.
maxReviewsPerProduct caps the number of individual rows returned; the average, the count and
the per-star breakdown are always complete regardless of that cap.
Delivery estimate and shipping cost
deliveryEstimate and shippingCost are always null, and that is a property of the store,
not a gap in this actor. Casas Bahia quotes delivery windows and freight only against a
customer postal code (CEP) entered on the product page: with no CEP the page's own freight
panel is empty, so there is no anonymous shipping figure to read. What the store does publish
without a CEP is captured: pickupInStore (whether the product can be collected in a store),
availability.national / .regional / .commercial, and inStock.
Input
Modes
mode: "search"withqueries(keywords) and/or thecategoriesfilter.mode: "url"withurls. Accepted shapes:- product page,
https://www.casasbahia.com.br/<slug>/p/<sku> - search page,
https://www.casasbahia.com.br/<keyword>/b(with?page=,?filter=and?ordenacao=preserved, so a pasted page 3 starts at page 3) - department page,
https://www.casasbahia.com.br/c/<department>?filtro=categoria-c13 - a bare product code, for example
1558278013
- product page,
Filters, in both modes
Every filter narrows a keyword search and a pasted department or search link.
| Input | Applied by |
|---|---|
categories (department) | the store |
brands (brand names, for example Consul) | the store |
minPrice / maxPrice | the store |
minDiscountPercent | the store |
minRating | the store |
minInstallments, interestFreeInstallmentsOnly | this actor, after reading each product's payment terms |
inStockOnly | this actor, after reading live availability |
sortBy | the store |
Brand names are matched against the store's own brand list for your search, ignoring case and accents, so you never have to know an internal brand code. If none of the names you enter exist in that list the run returns nothing and says so, rather than quietly dropping the filter and handing back the unfiltered catalogue.
minInstallments and interestFreeInstallmentsOnly are marked "this actor" because the store
publishes no instalment facet. They are honest post-filters, not a claim that the store narrowed
anything.
Connection
The default is Apify Proxy on the standard pool, which is enough for everything this actor
does: catalogue search, pricing and product pages. This store refuses individual exits from
time to time rather than whole pools, and a refused request is retried on a fresh exit
automatically, so an occasional refusal is not something you need to pay your way out of. If
refusals persist, switch the Connection section to the RESIDENTIAL group with country BR,
which usually clears them but costs considerably more per gigabyte. You can also supply your own
exits. If a run cannot read any results the actor fails loudly with that explanation rather than
reporting an empty search.
Resume and recurring updates
resumeFromRunIdcontinues ONE interrupted run: paste a previous run or dataset id and products already collected there are skipped, not re-returned and not re-billed.incrementalMode(default off) is for recurring monitoring. The first run returns everything asNEW; later runs return onlyNEW,UPDATEDandREAPPEARED, which is how a price cut or a stock change shows up.emitUnchangedandemitExpiredare off by default because they return, and bill, extra rows.- State is keyed on the search, the filters and the detail settings, so two different setups
never share a baseline. Use
stateKeyto name a campaign or to share one deliberately.
reviews is deliberately 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 are all fingerprinted and do appear in changedFields.
Export to your apps (optional)
| Input | What it does |
|---|---|
mcpConnectors | Pipe results into your apps (optional). Select one or more authorized MCP connectors. Empty by default, and leaving it empty skips the export entirely. |
notionParentPageUrl | Notion parent page (Notion connector only). The page new item pages are created under. Ignored by every other connector. |
maxNotifyListings | Max items to export per connector. Defaults to 50. Caps the export only, never the dataset. |
Output sample
{"productId": "55072122","productGroupId": "93194933","title": "Smartphone Example 6.8\" 512GB 5G","brand": "Example Brand","url": "https://www.casasbahia.com.br/smartphone-example-55072122.html","categoryPath": ["Telefones e Celulares", "Smartphone", "Smartphone Android"],"price": 6754.44,"originalPrice": 8998.89,"discountPercent": 25,"discountAmount": 2244.45,"currency": "BRL","onSale": true,"cashPrice": 6079.0,"cashPriceLabel": "No Pix","cashDiscountPercent": 10,"hasPixDiscount": true,"installmentText": "24x de R$ 281,44 sem juros","installmentCount": 24,"installmentValue": 281.44,"installmentInterestFree": true,"inStock": true,"pickupInStore": true,"deliveryEstimate": null,"shippingCost": null,"sellerName": "Casas Bahia","ean": "0000000000000","variantOptions": [{ "name": "Cor", "values": ["Preto", "Verde"] },{ "name": "Armazenamento", "values": ["512GB"] }],"rating": 4.8,"reviewCount": 6,"ratingBreakdown": [{ "rating": 5, "percentage": 83, "label": "Excelente" }],"reviews": [{"reviewId": "0000","author": "Cliente","date": "27/04/2026","rating": 5,"text": "Sample review text.","helpfulCount": 1,"notHelpfulCount": 0}],"scrapedAt": "2026-08-28T00:00:00Z"}
Personal details in the sample above are placeholders. Real runs return the review author name exactly as the store publishes it.
What you are charged for
Three events:
- Product result, charged once per product returned.
- Detail enrichment, charged once per product when
fetchDetailsis on. This is the description, the specification table, the variants, manufacturer and warranty information, the full gallery, the pickup signal, every instalment plan and the reviews. TurnfetchDetailsoff for a cheaper run that still returns the live price, the discount, the Pix price and the headline instalment terms. - Actor start, charged once per run.
A product suppressed by incremental mode is neither returned nor charged, even though its page was read to work out that nothing changed.
Notes and limits
- The catalogue's page size is fixed at 20 rows by the store; larger pages are rejected.
- Some result rows are the store's own promoted placements. They are returned like any other
product and flagged with
sponsored: trueso 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.
maxItemsdefaults to 20. Set it to 0 for an uncapped run, and expect a large department to be large.- Sorting by price is the store's own ordering, applied to the price in its search index.
Each row's
priceis read live at scrape time, so a product whose price moved since the store last indexed it can appear slightly out of order. The price you get is the current one, which is the useful half of that trade. - No concurrency, retry or timeout knobs are exposed. Retries are hard-capped internally and a run that cannot read its pages fails fast rather than grinding.
Send results into your apps (MCP connectors)
Optionally pipe results into Notion, Linear, Airtable or Apify through Model Context Protocol
connectors. Authorize a connector under Apify, Settings, API & Integrations, then select it in
mcpConnectors. The dataset output is never changed by this.