Casas Bahia Scraper — Brazil Retail Prices & Specs avatar

Casas Bahia Scraper — Brazil Retail Prices & Specs

Pricing

from $2.81 / 1,000 products

Go to Apify Store
Casas Bahia Scraper — Brazil Retail Prices & Specs

Casas Bahia Scraper — Brazil Retail Prices & Specs

Scrape Casas Bahia (casasbahia.com.br) product listings by category or search URL. Returns product id, title, price, installment terms, rating, review count, image and URL. Pay per result.

Pricing

from $2.81 / 1,000 products

Rating

0.0

(0)

Developer

Vitalii Bondarev

Vitalii Bondarev

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

3

Monthly active users

6 days ago

Last modified

Features

Limited permissions

Share

Scrape product listings from Casas Bahia (casasbahia.com.br), one of Brazil's largest retailers, by category or search URL. Get clean, structured product data you can pipe straight into price monitoring, market research, repricing, or a catalog feed — pay per product returned, no subscription.

What you get

One row per product, in the order it appears on the page:

FieldDescription
product_idCasas Bahia product id (from the /p/<id> URL)
titleFull product name
urlCanonical product page URL
priceCash / à-vista price as a number (BRL)
price_stringPrice as shown (e.g. R$ 776,67)
currencyAlways BRL
installmentInstallment terms (e.g. por R$ 776,67 ou em até 10x de R$ 77,67 sem juros)
ratingAverage star rating (0–5)
reviews_countNumber of customer reviews
is_sponsoredtrue if the slot is a sponsored placement
image_urlProduct image URL
positionPosition on the page (0-based)
source_urlThe listing URL this product came from
scraped_atISO 8601 timestamp of the run

Input

FieldTypeDescription
startUrlsarrayCategory / search listing URLs to scrape, e.g. https://www.casasbahia.com.br/smartphone/b. Paste any listing page from the site.
categoryUrlstringConvenience: a single listing URL added to the list.
maxItemsintegerMax products to return across all listings (default 60; 0 = unlimited).

Find a listing URL by browsing the site to any category or search-results page and copying the address — for example …/geladeira/b, …/notebook/b, …/smartphone/b. The scraper paginates automatically until maxItems is reached.

Example input

{
"startUrls": [
{ "url": "https://www.casasbahia.com.br/smartphone/b" }
],
"maxItems": 60
}

Access & reliability

Casas Bahia renders its product grid client-side behind a bot-defence edge. This actor reaches the site through a built-in managed residential exit (Brazil) and a real browser, so the grid renders exactly as a shopper sees it — no proxy account, key, or setup is required on your side. Parsing keys on structural test hooks (not styling classes), so it keeps working across the site's front-end redeploys.

Run status

Each run writes a RUN_STATUS key containing a summary of pagination, delivery, and coverage:

FieldDescription
pagesTotalNumber of listing pages attempted during the run.
pagesBlockedNumber of pages identified as blocked by bot-defence or access-denied responses.
pagesEmptyNumber of pages successfully fetched and parsed as genuine empty listings.
fetchErrorsNumber of pages that could not be reliably fetched or interpreted, including empty response bodies and parser-drift/inconclusive responses.
deliveredRecordsNumber of product records successfully delivered to the dataset.
coverageCompletetrue when pagination completed normally; false when a blocked page, fetch error, parser drift, deadline, or page cap stopped coverage.
lastBlockedUrlURL of the most recent blocked page, or null when no page was blocked.

A genuine empty listing is a successfully loaded listing response with no product containers or products. It increments pagesEmpty and does not indicate a block or fetch failure. A blocked response increments pagesBlocked and sets coverageComplete to false; a transport or response failure increments fetchErrors. A response containing product-like containers that cannot be parsed is treated as parser drift and also increments fetchErrors, rather than being reported as a valid empty listing.

Consequently, a run that delivers zero records can still be successful when it ends on a genuine empty listing: deliveredRecords is 0, pagesEmpty is incremented, and coverageComplete can remain true. A zero-record run stopped by a block, fetch error, or parser drift instead records the corresponding diagnostic counter and has coverageComplete: false. Records delivered before a later blocked page are retained; the run reports those records while coverageComplete remains false.

Pricing

Pay per product returned (pay-per-result). You are charged only for products actually delivered to your dataset — failed or empty pages cost nothing.