# Bic Camera Scraper - Prices, Points, Specs & Reviews (`abotapi/biccamera-com-scraper`) Actor

Scrape Bic Camera (biccamera.com) products: JPY price, list price and discount, Bic Point amount and rate, stock and delivery, spec table, image gallery, colour and capacity variants, plus review text with author, date, star rating and variant reviewed. Search by keyword, category or pasted links.

- **URL**: https://apify.com/abotapi/biccamera-com-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** E-commerce, Developer tools, Automation
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 79.3% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 product results

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

## Bic Camera Scraper: Prices, Points, Specs and Reviews

Bic Camera Scraper turns biccamera.com, the online store of one of Japan's major consumer electronics chains, into a clean product data API. Get the yen price, the Bic Point reward and rate, stock and delivery status, the full specification table, image gallery, colour and capacity variants, and complete review text. Search by keyword or category, or paste product, search, category or review links, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

### Why This Scraper?

- **Japanese search that actually works.** Keywords are encoded the way the site's own search box encodes them, not as plain UTF-8, so Japanese terms return real results instead of a silent zero.
- **The full commercial picture in one row.** Yen price, Bic Point amount and rate, the effective price after points, list price versus the site's common `オープン価格` ("open price"), and second-hand offers, all in the same record.
- **Availability and delivery, in the site's own words.** Stock status, free shipping, the quoted delivery date and manufacturer warranty, exactly as the product page prints them.
- **Deep enrichment on demand.** Switch on the full spec table, image gallery, colour and capacity variants, and complete review text per product. Searches stay at the plain per-product rate unless you turn enrichment on.
- **Built for monitoring.** Incremental mode tracks a search over time (`NEW`, `UPDATED`, `UNCHANGED`, `REAPPEARED`, `EXPIRED`), and Resume continues one interrupted run without re-charging what it already collected.
- **A real connection, no setup.** The default proxy is the Japan-based connection this site actually accepts, so the actor works out of the box; other connection settings are refused by the site itself.
- **Fails loudly, not silently.** When the site cannot be reached at all, the run stops with a clear message instead of reporting an empty search as if nothing matched.

### Use Cases

- **Price and point tracking:** watch yen price, Bic Point rate and effective price across a category or a watchlist to catch deals as they happen.
- **Competitive and catalog research:** pull full spec tables, variants and breadcrumbs to compare models across brands.
- **Stock and delivery monitoring:** alert on restocks, sold-out status or delivery-date changes for specific products.
- **Review and sentiment analysis:** collect full review text, star ratings and purchase channel to analyze customer feedback.
- **Deal and marketplace feeds:** feed price, points and availability into your own site, bot or spreadsheet.

### Data You Get

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

| Field | Example |
| --- | --- |
| `itemId` | `"90000001"` |
| `title` | `"サンプル Bluetoothスピーカー 防水対応 ネイビー"` |
| `brand` / `modelNumber` | `"サンプルブランド｜SampleBrand"` / `"SB-100"` |
| `janCode` / `color` | `"4901234567890"` / `"ネイビー"` |
| `url` / `breadcrumbs` | product link / `["オーディオ", "スピーカー"]` |
| `rank` / `isSponsored` | position in the result grid / `true` for a PR placement |
| `price` / `currency` | `6980` / `"JPY"` |
| `originalPrice` / `originalPriceText` | filled only when the site prints a real list price / `"オープン価格"` when it does not |
| `discountPercent` | filled only when both prices are numbers |
| `pointAmount` / `pointRate` | `69` / `1` |
| `effectivePrice` | `6911` (price minus points) |
| `usedPrice` / `usedOfferCount` | cheapest second-hand offer, when the site lists one |
| `inStock` / `availabilityText` | `true` / `"在庫あり"` |
| `freeShipping` | `true` when the listing shows 送料無料 |
| `arrivalDate` / `deliveryText` | quoted delivery date / the full delivery line as printed |
| `warranty` | manufacturer warranty (メーカー保証年数), when published |
| `releaseDate` / `releaseDateText` | ISO date / as printed |
| `thumbnail` / `images` | main image / full gallery (with `Fetch full product detail`) |
| `specifications` / `description` | spec table as key/value / product text (with `Fetch full product detail`) |
| `variants` | colour/capacity siblings: type, title, price, stock, url (with `Fetch full product detail`) |
| `reviews` | object: `averageRating`, `totalReviewCount`, `ratingDistribution`, `items[]` (with `Fetch reviews`) |
| `rating` / `reviewCount` | `4.3` / `12` |
| `changeType` / `changedFields` | `"NEW"`, `"UPDATED"`, `"UNCHANGED"`, `"REAPPEARED"` or `"EXPIRED"` (incremental mode) |
| `firstSeenAt` / `lastSeenAt` | ISO timestamps (incremental mode) |
| `source` / `scrapedAt` | `"listing"` or `"detail"` / ISO timestamp |

Each review carries `reviewId`, `author`, `date`, `rating`, `title`, `body`, `helpfulCount`, `variant` (the colour or capacity the reviewer bought), `purchaseChannel` and `images`. A product with no reviews returns `items: []` with `totalReviewCount: 0`, never a made-up value.

### How to Use

1. Pick a **mode**: `search` (keywords and/or category) or `url` (paste product, search, category or review links).
2. In search mode, add keywords and/or a category, then narrow with brand and sort order if you like. Switch on `Fetch full product detail` and/or `Fetch reviews` only for a small, targeted set: they add extra page reads and the enrichment charge.
   **Reviews only:** in `url` mode paste product links, switch on `Fetch reviews` and leave `Fetch full product detail` off. Each product returns its rating summary and review rows (author, ISO date, numeric rating, title, body, purchase channel); the `Reviews` output view shows them.
3. Set **Max products total** to control run size and cost, then click **Start**.
4. Download the dataset as JSON, CSV or Excel, or read it through the API.

**Search a category by keyword:**

```json
{
  "mode": "search",
  "searchTerms": ["カメラ"],
  "maxItems": 20
}
```

**Browse a category, narrowed by brand and sort order:**

```json
{
  "mode": "search",
  "category": "001/120/001",
  "brand": "ソニー｜SONY",
  "sortBy": "PRICE_ASC",
  "maxItems": 50
}
```

**A small enrichment run on pasted product links:**

```json
{
  "mode": "url",
  "urls": [
    "https://www.biccamera.com/bc/item/90000001/",
    "https://www.biccamera.com/bc/item/90000002/"
  ],
  "fetchDetails": true,
  "fetchReviews": true,
  "maxReviewsPerProduct": 20
}
```

**A category page filtered by price and stock:**

```json
{
  "mode": "url",
  "urls": ["https://www.biccamera.com/bc/category/001/120/001/"],
  "minPrice": 10000,
  "maxPrice": 50000,
  "inStockOnly": true,
  "maxItems": 100
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/biccamera-com-scraper").call(run_input={"mode": "search", "searchTerms": ["カメラ"]})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(product["title"], product["price"], product["currency"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/biccamera-com-scraper').call({ mode: 'search', searchTerms: ['カメラ'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

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

#### What you're charged for

- **Product result** - once per product returned.
- **Detail and review enrichment** - once per product when `Fetch full product detail` and/or `Fetch reviews` fetched extra pages for it. Charged as one `detail-enrichment` unit per product, per row, at the moment that product is added to the results (not at the end of the run), even when both toggles are on, never per review page and never for a product that is skipped as unchanged. `Max reviews per product` defaults to 20 (schema maximum 1000, `0` = every review the site lists), which limits how many reviews are read per product. A pasted **product** link is always read from its full product page, so each product link you paste carries this charge even with both toggles off.
- **Actor start** - the platform's standard start event.

Both enrichment toggles are off by default, so a plain search (or a pasted search or category link) only ever pays the per-product rate. This is also the recommended setting for broad searches, since enrichment adds page reads and can make a run slower. For an enrichment run, set a small **Max products total**, or paste the specific product URLs you want to inspect.

The default **URLs to scrape** list is non-empty: it holds a category link, a keyword search link and one product link. Because the product link is always read from its full page, running the default list in `url` mode charges the `detail-enrichment` unit for that one product on top of the per-product result charge. Clear or replace the list to control this.

#### Resume and recurring updates

- **Resume** (`resumeFromRunId`) continues one interrupted run: paste its run or dataset id and the actor skips everything already collected there, so you don't pay twice.
- **Incremental mode** (`incrementalMode`) is for running the same search again and again, for example daily. Each product is classified `NEW`, `UPDATED` (with `changedFields`), `UNCHANGED` (suppressed and not billed unless `emitUnchanged` is on), `REAPPEARED` or `EXPIRED` (only after a run that scanned the whole tracked search, and only with `emitExpired`). `stateKey` names or shares the stored state; left empty, the actor derives one automatically from the search, filters and detail/review settings, so different searches never mix state. `ignoreFieldsForChanges` lists field names (dotted paths reach nested fields) that must not make a product count as `UPDATED`; they stay in the output and are only left out of the comparison and of `changedFields`. Changing it never resets stored state. With incremental mode off, output is exactly as before.

### 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 product, 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

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` (keywords and/or category) or `url` (paste product, search-result, category or review links). |
| `searchTerms` | array | `["カメラ"]` | One keyword per line, Japanese or English. Leave empty and set only Category to browse a whole category. |
| `category` | string | (none) | A Bic Camera category code as it appears in a category URL, e.g. `001120` or `001/120/001`. |
| `brand` | string | (none) | The site's own brand facet value, written exactly as the facet link shows it, e.g. `ソニー｜SONY`. |
| `sortBy` | string | `RELEVANCE` | One of the site's eight result orders: `RELEVANCE`, `PRICE_ASC`, `PRICE_DESC`, `TOP_RATED`, `MOST_REVIEWED`, `FASTEST_DELIVERY`, `RELEASE_DATE`, `NEWEST`. Search mode only. |
| `includeDiscontinued` | boolean | `false` | Include products the site marks as no longer sold. Search mode only. |
| `groupVariations` | boolean | `false` | Collapse colour/capacity siblings of the same model into a single result. Search mode only. |
| `urls` | array | one example per link type (category page, keyword search, product) | Product, search-result or category page links to scrape. Pagination continues forward from any page number already in the URL. Search-mode settings are ignored in this mode. Japanese keywords copied from a browser address bar are converted automatically to the encoding the site expects. **Change:** in `url` mode, leaving this field unedited now scrapes one example per link type (category, keyword search, product) instead of a single category page. |
| `minPrice` | integer | (none) | Only return products at or above this price, in yen. Applied to the products this run reads, not a native site filter. |
| `maxPrice` | integer | (none) | Only return products at or below this price, in yen. Applied the same way as Minimum price. |
| `inStockOnly` | boolean | `false` | Drop products the site shows as sold out, suspended or discontinued. |
| `fetchDetails` | boolean | `false` | Optional enrichment: full spec table, description, model number, manufacturer list price, release date, breadcrumbs, full image gallery and colour/capacity variants. One extra page per product, plus the enrichment surcharge. |
| `fetchReviews` | boolean | `false` | Optional enrichment: overall rating, total review count, a star-rating breakdown of the reviews fetched, and per-review author, date, rating, title, body, helpful votes, purchase channel and variant. One or more extra pages per product, plus the enrichment surcharge. |
| `maxReviewsPerProduct` | integer | `20` | Cap on reviews fetched per product when Fetch reviews is on. Maximum 1000. `0` fetches every review the site lists. |
| `maxPages` | integer | (none) | Stop after this many result pages per keyword, category or pasted URL. Empty = no page limit. |
| `maxItems` | integer | `20` | Hard cap on total products returned across every keyword and URL. `0` = unlimited (still bounded by Max result pages per search). |
| `proxyConfiguration` | object | Japan-based Apify Proxy (`UNBLOCKER`) | Connection settings. The default is what makes the actor work with nothing to set up; the site refuses other settings. |
| `resumeFromRunId` | string | (none) | Paste a previous run id or dataset id to continue a large pull without returning or charging for products already collected there. |
| `incrementalMode` | boolean | `false` | Turn on for daily or recurring monitoring of the same search. Returns only new and changed products on repeated runs. |
| `ignoreFieldsForChanges` | array | (none) | Field names that must not trigger `UPDATED` (incremental mode only). Ignored fields remain in the output. |
| `stateKey` | string | (none) | Name this monitoring campaign, or share state across differently-configured runs. Left empty, the actor derives a key automatically from the search, filters and detail/review settings. |
| `emitUnchanged` | boolean | `false` | Also return (and bill) products that have not changed since the last run, marked `UNCHANGED`. |
| `emitExpired` | boolean | `false` | Also return (and bill) products from a previous run that are no longer found, marked `EXPIRED`. Only produced once a run has fully scanned the tracked search. |
| `mcpConnectors` | array | (none) | Optional: send a summary of each product to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | (none) | Notion connector only: page under which item pages are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. Does not affect the dataset. |

### Output Example

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

```json
{
  "itemId": "90000001",
  "title": "サンプル Bluetoothスピーカー 防水対応 ネイビー",
  "brand": "サンプルブランド｜SampleBrand",
  "modelNumber": "SB-100",
  "janCode": "4901234567890",
  "color": "ネイビー",
  "url": "https://www.biccamera.com/bc/item/90000001/",
  "breadcrumbs": ["オーディオ", "スピーカー"],
  "price": 6980,
  "currency": "JPY",
  "originalPriceText": "オープン価格",
  "pointAmount": 69,
  "pointRate": 1,
  "effectivePrice": 6911,
  "inStock": true,
  "availabilityText": "在庫あり",
  "freeShipping": true,
  "releaseDate": "2025-04-01",
  "specifications": {
    "防水性能": "IPX4",
    "連続再生時間": "12時間",
    "重量": "180g"
  },
  "variants": [
    {"optionType": "色", "title": "ブラック", "price": 6980, "inStock": true,
     "url": "https://www.biccamera.com/bc/item/90000002/"}
  ],
  "images": ["https://image.biccamera.com/img/00000090000001_A01.jpg"],
  "rating": 4.3,
  "reviewCount": 12,
  "reviews": {
    "averageRating": 4.3,
    "totalReviewCount": 12,
    "ratingDistribution": {"1": 0, "2": 0, "3": 1, "4": 4, "5": 7},
    "items": [
      {
        "reviewId": "0000001",
        "author": "サンプルユーザー",
        "date": "2026-01-15",
        "rating": 5,
        "title": "レビュータイトルの例",
        "body": "これはサンプルのレビュー本文です。実際の投稿内容ではありません。",
        "helpfulCount": 2,
        "variant": "色：ネイビー",
        "purchaseChannel": "ビックカメラ.comで購入",
        "images": []
      }
    ]
  },
  "source": "detail",
  "scrapedAt": "2026-01-20T03:00:00Z"
}
```

### Plan Requirement

Bic Camera refuses ordinary datacenter connections with a plain "access blocked" page, so the default proxy setting is the Japan-based Apify Proxy connection (`UNBLOCKER`). When your plan's proxy access is refused (for example on a free plan), the actor logs this notice and continues on a backup connection:

> The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable. For residential access, upgrade at https://apify.com/pricing or supply your own proxy URLs.

The site can also refuse the default connection itself with an "access blocked" page. In that case the actor retries on fresh exits and then switches to the backup connection without that notice; once a page is served this way the log says: "Served over the backup connection (the default connection was unavailable)." The backup connection is not guaranteed to load every page. If no page can be read, the run fails with an explicit message (a plan without proxy access, a backup connection that could not load the pages, or a general connection failure) rather than returning a silent empty dataset. Usage of the Apify Proxy connection you select is billed to your own Apify plan, not to this actor.

### FAQ

#### How much does it cost?

You pay per product returned, with detail and review enrichment billed once per product, as each row is delivered, only when you switch those on or paste individual product links (which are always read from the full product page, including the product link in the default URL list). The **Pricing** tab shows the current rates. Use **Max products total** to cap the cost of any run.

#### Is it legal to scrape Bic Camera?

This actor collects only publicly available catalogue data. You are responsible for how you use it: follow Bic Camera's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Bic Camera is a trademark of its owner; this actor is not affiliated with or endorsed by Bic Camera.

#### Can I get only new or changed products on a schedule?

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

#### Why does a product show `オープン価格` instead of a list price?

Japanese electronics are commonly sold at `オープン価格` ("open price"), meaning the manufacturer publishes no list price at all. When that is what the product page prints, `originalPriceText` reports it exactly; `originalPrice` and `discountPercent` are filled in only when there is a real number to compare against, never invented.

#### 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 found" is never confused with "nothing could be read". Run it again in a few minutes.

#### 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:

<table>
<tr><td>🔌 <a href="https://apify.com/abotapi/yodobashi-com-scraper"><b>Yodobashi Scraper</b></a><br>Scrape yodobashi.com electronics and appliances: JPY price, list price and discount...</td><td>🔌 <a href="https://apify.com/abotapi/boulanger-com-scraper"><b>Boulanger.com</b></a><br>Scrape Boulanger (boulanger.com) electronics and home-appliance products: current price...</td></tr>
<tr><td>🔌 <a href="https://apify.com/abotapi/fnac-com-scraper"><b>Fnac Scraper</b></a><br>Scrape Fnac (fnac.com) products: current price plus strike-through discount, colour/model...</td><td>🔌 <a href="https://apify.com/abotapi/dienmayxanh-scraper"><b>Dienmayxanh Scraper</b></a><br>Scrape dienmayxanh.com home appliances and electronics with full specifications, current...</td></tr>
<tr><td>🔌 <a href="https://apify.com/abotapi/appliancesonline-com-au-scraper"><b>Appliances Online Scraper</b></a><br>Scrape appliancesonline.com.au by category, keyword, or URL. Extract title, brand, AUD...</td><td>🔌 <a href="https://apify.com/abotapi/currys-co-uk"><b>Currys UK Scraper</b></a><br>Scrape Currys UK products, including electronics, home appliances, computers, TVs and...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/biccamera-com-scraper/issues/open). 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.

# Actor input Schema

## `mode` (type: `string`):

'search' finds products by keyword and/or category with the site's own sort orders and brand facet. 'url' scrapes any product, search-result, category or review page URL you paste, walking pagination forward automatically.

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

One keyword per line, in Japanese or English, e.g. 'カメラ', 'iPhone', 'Panasonic 冷蔵庫'. Japanese is encoded the way the site's own search box encodes it, so Japanese keywords work exactly as typed. Leave empty and set only Category below to browse a whole category.

## `category` (type: `string`):

A Bic Camera category code as it appears in a category page URL, e.g. '001120' or '001/120/001' for cameras. Narrows a keyword search, or browses the whole category when Search keywords is left empty.

## `brand` (type: `string`):

The site's own brand facet value, written exactly as the facet link shows it, for example 'ソニー｜SONY' or 'キヤノン｜CANON'. The brand printed on each returned row may put the two halves the other way round; that is the site's own labelling, not a mismatch. Leave empty for all brands.

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

One of the site's own eight result orders. Applies to Search mode; in URL mode the order already in the pasted URL is kept.

## `includeDiscontinued` (type: `boolean`):

Off by default, matching the site: results normally exclude products that are no longer sold. Turn on to include them, using the site's own switch. Applies to Search mode.

## `groupVariations` (type: `boolean`):

Off by default. Turn on to let the site collapse colour/capacity siblings of the same model into a single result instead of listing each one. Applies to Search mode.

## `urls` (type: `array`):

Paste one or more Bic Camera product pages (https://www.biccamera.com/bc/item/<id>/), search-result pages (https://www.biccamera.com/bc/category/?q=...), or category pages (https://www.biccamera.com/bc/category/001/120/001/). Pagination continues forward from any page number already in the URL. Search-mode keyword, category, brand and sort settings are ignored in this mode.

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

Only return products at or above this price, in yen. The site has no price-range filter of its own, so this is applied to the products this run reads; it narrows the output, not the pages fetched. Products whose price could not be read are excluded while any price bound is set.

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

Only return products at or below this price, in yen. Applied to the products this run reads, the same way as Minimum price above.

## `inStockOnly` (type: `boolean`):

Off by default. Turn on to drop products the site shows as sold out, suspended or discontinued. Applied to the products this run reads.

## `fetchDetails` (type: `boolean`):

Optional enrichment. Adds the full specification table, description, model number, manufacturer suggested retail price and discount, release date, breadcrumb category path, full image gallery and colour/capacity variants from each product page. This reads one extra page per product, adds the enrichment surcharge, and can make large runs much slower. Leave off for fast catalog searches; turn on for a small, targeted set of products when you need specifications or variants. Title, brand, price, points, rating and review count are already returned without this toggle.

## `fetchReviews` (type: `boolean`):

Optional enrichment. Adds each product's reviews: overall rating, total review count, a 1-5 star breakdown of the reviews fetched, and per review the author, date, star rating, title, body, helpful votes, purchase channel and the colour/capacity the reviewer bought. This reads one or more extra pages per product, adds the enrichment surcharge, and is substantially slower on large result sets. Leave off for fast catalog searches; turn on for a small, targeted set when review text is needed. Products with no reviews return an empty list.

## `maxReviewsPerProduct` (type: `integer`):

Cap on reviews fetched per product when Fetch reviews is on. Reviews come 10 per page, so a lower cap keeps enrichment faster and cheaper. The default fetches up to 20 reviews per product; use 0 only when you need every review the site lists. Values above 1000 are not accepted.

## `maxPages` (type: `integer`):

Stop after this many result pages per keyword, category or pasted URL. Leave empty for no page limit: the run then stops at Max products total, or at the end of the results.

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

Hard cap on total products returned across every keyword and URL. 0 = unlimited (still bounded by Max result pages per search). Values above 1000000 are not accepted.

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

Bic Camera only answers connections it recognises as a real browser inside Japan, so the default routes this run through a Japan-based connection built for sites that are strict about this. Change it only if you have your own Japanese proxies to use: other connection settings are refused by the site.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue a large catalogue pull without returning or charging for products already collected there. Use this after an interrupted run. For recurring monitoring of the same search, use Incremental mode below instead.

## `incrementalMode` (type: `boolean`):

Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED products. Turn on Emit unchanged or Emit expired only when you also want those products returned (and billed). State is kept separately for each search, category, URL set and detail/review setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search, filters and detail/review settings, so different searches never mix state with each other.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns, and bills for, extra rows you already have, so leave it off unless you want the full snapshot every run.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max products capped it or when Resume was used. This returns, and bills for, extra synthetic rows, so leave it off unless you need expiry tracking.

## `ignoreFieldsForChanges` (type: `array`):

Optional. Field names that must NOT make a product count as UPDATED, for example "rating" or "reviews.count" (dotted paths reach nested fields). Ignored fields stay in the output and the saved baseline; they are only left out of the comparison and of changedFields. Leave empty to compare every field.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title plus key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "カメラ"
  ],
  "sortBy": "RELEVANCE",
  "includeDiscontinued": false,
  "groupVariations": false,
  "urls": [
    "https://www.biccamera.com/bc/category/001/120/001/",
    "https://www.biccamera.com/bc/category/?q=%83J%83%81%83%89",
    "https://www.biccamera.com/bc/item/14949907/"
  ],
  "inStockOnly": false,
  "fetchDetails": false,
  "fetchReviews": false,
  "maxReviewsPerProduct": 20,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ],
    "apifyProxyCountry": "JP"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `detail` (type: `string`):

No description

## `reviews` (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 = {
    "mode": "search",
    "searchTerms": [
        "カメラ"
    ],
    "urls": [
        "https://www.biccamera.com/bc/category/001/120/001/",
        "https://www.biccamera.com/bc/category/?q=%83J%83%81%83%89",
        "https://www.biccamera.com/bc/item/14949907/"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ],
        "apifyProxyCountry": "JP"
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/biccamera-com-scraper").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 = {
    "mode": "search",
    "searchTerms": ["カメラ"],
    "urls": [
        "https://www.biccamera.com/bc/category/001/120/001/",
        "https://www.biccamera.com/bc/category/?q=%83J%83%81%83%89",
        "https://www.biccamera.com/bc/item/14949907/",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
        "apifyProxyCountry": "JP",
    },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/biccamera-com-scraper").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 '{
  "mode": "search",
  "searchTerms": [
    "カメラ"
  ],
  "urls": [
    "https://www.biccamera.com/bc/category/001/120/001/",
    "https://www.biccamera.com/bc/category/?q=%83J%83%81%83%89",
    "https://www.biccamera.com/bc/item/14949907/"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ],
    "apifyProxyCountry": "JP"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false
}' |
apify call abotapi/biccamera-com-scraper --silent --output-dataset

```

## MCP server setup

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

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/ifAUV52F6UhfDAN4J/builds/ndZiTJqVpATmOCS4E/openapi.json
