Casas Bahia Scraper — Brazil Retail Prices & Specs
Pricing
from $2.81 / 1,000 products
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
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
3
Monthly active users
6 days ago
Last modified
Categories
Features
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:
| Field | Description |
|---|---|
product_id | Casas Bahia product id (from the /p/<id> URL) |
title | Full product name |
url | Canonical product page URL |
price | Cash / à-vista price as a number (BRL) |
price_string | Price as shown (e.g. R$ 776,67) |
currency | Always BRL |
installment | Installment terms (e.g. por R$ 776,67 ou em até 10x de R$ 77,67 sem juros) |
rating | Average star rating (0–5) |
reviews_count | Number of customer reviews |
is_sponsored | true if the slot is a sponsored placement |
image_url | Product image URL |
position | Position on the page (0-based) |
source_url | The listing URL this product came from |
scraped_at | ISO 8601 timestamp of the run |
Input
| Field | Type | Description |
|---|---|---|
startUrls | array | Category / search listing URLs to scrape, e.g. https://www.casasbahia.com.br/smartphone/b. Paste any listing page from the site. |
categoryUrl | string | Convenience: a single listing URL added to the list. |
maxItems | integer | Max 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:
| Field | Description |
|---|---|
pagesTotal | Number of listing pages attempted during the run. |
pagesBlocked | Number of pages identified as blocked by bot-defence or access-denied responses. |
pagesEmpty | Number of pages successfully fetched and parsed as genuine empty listings. |
fetchErrors | Number of pages that could not be reliably fetched or interpreted, including empty response bodies and parser-drift/inconclusive responses. |
deliveredRecords | Number of product records successfully delivered to the dataset. |
coverageComplete | true when pagination completed normally; false when a blocked page, fetch error, parser drift, deadline, or page cap stopped coverage. |
lastBlockedUrl | URL 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.