# 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
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Bic Camera Scraper - prices, points, specs and reviews

Scrape **Bic Camera** (`biccamera.com`), Japan's largest consumer-electronics chain, into clean
structured JSON, CSV or Excel. Search by keyword or category, or paste product, search and category
links, and get back the yen price, the Bic Point reward, stock and delivery, the full specification
table, the image gallery, colour and capacity variants, and full review text.

No code and nothing to configure: the connection Bic Camera requires is set up for you out of the
box.

***

### What you get

Every product row carries the whole overview record. `Fetch full product detail` and `Fetch reviews`
add the rest.

#### Identity

| Field | What it is |
|---|---|
| `itemId` | Bic Camera's own item code (商品コード), the stable id for a product |
| `title` | Product name as listed |
| `brand` | Manufacturer as the site writes it, e.g. `Apple｜アップル` |
| `modelNumber` | Manufacturer model code (型番), from the product page |
| `janCode` | JAN barcode, when the product page publishes one |
| `color` | Colour of this specific item |
| `url` | Canonical product URL, always rebuilt from the item code |
| `breadcrumbs` | Category path, e.g. `["カメラ・カメラレンズ・メモリーカード", "デジタル一眼"]` |
| `rank` | Position of the product in the result grid |
| `isSponsored` | `true` for a PR / sponsored placement |

#### Price and points

| Field | What it is |
|---|---|
| `price` | Current selling price in yen, tax included |
| `currency` | Always `JPY` |
| `originalPrice` | Manufacturer list price as a number, when the site publishes one |
| `originalPriceText` | The list price exactly as printed, including `オープン価格` |
| `discountPercent` | Discount off the list price, when both prices are numbers |
| `pointAmount` | Bic Points awarded on this purchase |
| `pointRate` | Those points as a percentage of the price |
| `effectivePrice` | `price` minus `pointAmount`: what the purchase really costs you |
| `pointText` | The point line exactly as printed |
| `usedPrice` / `usedOfferCount` | Cheapest second-hand offer and how many the site lists |

> **About list prices on this site.** Japanese electronics are overwhelmingly sold at
> `オープン価格` ("open price"), meaning the manufacturer publishes no list price at all. Across
> live checks on cameras, phones, appliances and clearance stock, that is what the product page
> prints. So `originalPriceText` always tells you exactly what the site said, while `originalPrice`
> and `discountPercent` are filled in only when there is a real number to compare against, and are
> left empty rather than invented when there is not.

#### Availability and delivery

| Field | What it is |
|---|---|
| `inStock` | `true` / `false`, or empty when the page says nothing about stock |
| `availabilityText` | The site's own wording, e.g. `在庫あり`, `予定数の販売を終了しました` |
| `freeShipping` | `true` when the listing shows 送料無料 |
| `arrivalDate` | Quoted delivery date, e.g. `8月28日（金）` |
| `deliveryText` | The full delivery line as printed |
| `warranty` | Manufacturer warranty (メーカー保証年数), when published |
| `releaseDate` / `releaseDateText` | Release date, ISO and as printed |

#### Media, specs and variants (with `Fetch full product detail`)

| Field | What it is |
|---|---|
| `thumbnail` | Main image |
| `images` | Full-size gallery for this product, transform parameters stripped |
| `specifications` | The whole spec table as a key/value object |
| `description` | Product description |
| `variants` | Colour and capacity siblings: `optionType` (色 / 容量), `title`, `price`, `availabilityText`, `inStock`, `url`, `image`, `selected` |

#### Reviews (with `Fetch reviews`)

`reviews` is an object:

| Field | What it is |
|---|---|
| `averageRating` | Overall star rating |
| `totalReviewCount` | How many reviews the product has in total |
| `ratingDistribution` | 1-5 star histogram **of the reviews this run fetched** |
| `items[]` | One entry per review |

Each review carries `reviewId`, `author`, `date` (ISO) and `dateText`, `rating`, `title`, `body`,
`helpfulCount`, `variant` (the colour or capacity the reviewer actually bought), `purchaseChannel`
and `images`.

A product with no reviews returns `items: []` with `totalReviewCount: 0`, never a made-up value.

> `ratingDistribution` is computed from the reviews returned in this run, because Bic Camera does not
> publish a histogram of its own. If you cap `Max reviews per product`, the histogram describes that
> sample, not the product's whole lifetime.

#### Incremental mode fields

`changeType` (`NEW` / `UPDATED` / `UNCHANGED` / `REAPPEARED` / `EXPIRED`), `changedFields`,
`firstSeenAt`, `lastSeenAt`.

***

### Modes

#### Search

Give one or more keywords, a category, or both. **Japanese keywords work exactly as typed** - the
actor encodes them the way Bic Camera's own search box does, which is not UTF-8 and is the single
most common reason a hand-built Bic Camera scraper returns zero results.

Narrow with the site's own facets:

- **Category** - a Bic Camera category code as it appears in a category URL, e.g. `001120` or
  `001/120/001`. Use a *sub*-category: the top level of the tree is a landing page with no product
  list.
- **Brand** - the site's brand facet, written exactly as the site shows it, e.g. `ソニー｜SONY`.
- **Sort order** - all eight of the site's own orders: recommended, price low to high, price high to
  low, highest rated, most reviewed, fastest delivery, release date, newest.
- **Include discontinued products** and **Group colour and capacity variations** - the site's own two
  result switches.

#### URL

Paste any mix of:

- product pages: `https://www.biccamera.com/bc/item/14949907/`
- search results: `https://www.biccamera.com/bc/category/?q=...`
- category listings: `https://www.biccamera.com/bc/category/001/120/001/`
- review listings: `https://www.biccamera.com/bc/disp/SfrGoodsPageReview.jsp?GOODS_NO=...`

Pagination continues forward from whatever page number the URL already names.

#### Price and stock filters (both modes)

`Minimum price`, `Maximum price` and `In-stock products only` apply in search and URL mode alike.
Bic Camera has no price-range or in-stock filter of its own, so these narrow the products the run
returns rather than the pages it fetches. Products whose price could not be read are excluded while
a price bound is set.

***

### Country scope: Japan only

Bic Camera trades only in Japan. Its storefront quotes one currency (JPY) and ships domestically,
and the "English / 中文" entry in its own header leads to machine translations of the same Japanese
catalogue served through a third-party translation proxy, not to separate country storefronts. There
is no other Bic Camera country site to scrape, so this actor deliberately has **no `country` input**:
a country selector with a single working value would be misleading. Everything you see here is the
Japanese catalogue.

***

### Resume and recurring updates

- **Resume from a previous run** - paste a run or dataset id to continue one interrupted crawl.
  Products already collected there are skipped and not charged again.
- **Incremental mode** - for daily or weekly monitoring. The first run returns everything as `NEW`;
  later runs return only what changed. `Emit unchanged` and `Emit expired` are off by default because
  they return, and bill for, extra rows.

State is kept per search: the keywords, category, brand, filters and detail/review settings all feed
the state key, so two different monitoring campaigns never mix. Name a campaign with **State key**
when you want to control that yourself.

Expired detection only runs after a run has scanned the whole tracked search. A capped run, a resumed
run, or a run that could not finish the walk keeps the previous state instead of wrongly marking
products as gone.

***

### Connection

Bic Camera only answers connections it recognises as a real browser inside Japan. The default proxy
setting routes the run through a Japan-based connection built for sites that are strict about this,
which is what makes the actor work with nothing to set up on your side. Change it only if you have
your own Japanese proxies to use: other connection settings are refused by the site.

Result pages resolve in roughly 5 to 65 seconds each, which is a property of getting through that
protection rather than of the amount of data. A page that does not come back is retried on a fresh
connection, up to five times; if a run really cannot read anything, it **fails with a connection
message rather than reporting an empty search**, so you are never handed a silent zero.

***

### What you are 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 once per product even when both toggles are on,
  never per review page.
- **Actor start** - the platform's standard start event.

Both enrichment toggles are off by default, so a plain search only ever pays the per-product rate.

***

### Example output

```json
{
  "itemId": "14949907",
  "title": "【SIMフリー】iPhone 17e A19チップ搭載 6.1型 ストレージ：256GB eSIMのみ対応 MHRP4J/A ホワイト",
  "brand": "Apple｜アップル",
  "modelNumber": "MHRP4JA",
  "color": "ホワイト",
  "url": "https://www.biccamera.com/bc/item/14949907/",
  "price": 107800,
  "currency": "JPY",
  "originalPriceText": "オープン価格",
  "pointAmount": 1078,
  "pointRate": 1,
  "effectivePrice": 106722,
  "inStock": false,
  "availabilityText": "OutOfStock",
  "releaseDate": "2026-03-11",
  "breadcrumbs": ["スマートフォン・スマホアクセサリー", "SIMフリー iPhone"],
  "specifications": {
    "ストレージ": "256GB",
    "CPU": "A19チップ",
    "重量": "169g",
    "防水": "有"
  },
  "variants": [
    {"optionType": "色", "title": "ブラック", "price": 107800, "inStock": false,
     "url": "https://www.biccamera.com/bc/item/14949906/"},
    {"optionType": "容量", "title": "512GB", "price": 142800, "inStock": false,
     "url": "https://www.biccamera.com/bc/item/14949910/"}
  ],
  "images": ["https://image.biccamera.com/img/00000014949907_A01.jpg"],
  "rating": 4.7,
  "reviewCount": 210,
  "reviews": {
    "averageRating": 4.7,
    "totalReviewCount": 210,
    "ratingDistribution": {"1": 0, "2": 0, "3": 1, "4": 3, "5": 8},
    "items": [
      {
        "reviewId": "0000000",
        "author": "サンプルユーザー",
        "date": "2026-08-20",
        "rating": 5,
        "title": "レビュータイトルのサンプル",
        "body": "レビュー本文のサンプルです。実際の投稿ではありません。",
        "helpfulCount": 1,
        "variant": "色：ソフトピンク",
        "purchaseChannel": "ビックカメラグループで購入",
        "images": []
      }
    ]
  },
  "source": "detail",
  "scrapedAt": "2026-08-27T07:19:29Z"
}
```

***

### Notes and limits

- **Reviews are written by shoppers and are personal opinions.** Reviewer names are the display
  aliases the site publishes (often 匿名, "anonymous"); no contact details, account ids or other
  personal data are collected.
- Store-by-store shelf stock is not published on the product page, so it is not returned. Online
  availability, delivery date and free-shipping status are.
- Result pages occasionally render fewer products than their own banner announces. The run keeps what
  it got, says so in the log, and carries on rather than mistaking a short page for the end of the
  catalogue.
- Bic Camera is a trademark of its owner. This actor collects publicly visible catalogue data and is
  not affiliated with or endorsed by Bic Camera.

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

Adds the full specification table, description, model number, manufacturer suggested retail price and discount, release date, breadcrumb category path, the full image gallery and colour/capacity variants from each product page. Costs one extra page read per product and adds the enrichment surcharge below. Title, brand, price, points, rating and review count are already returned without this toggle.

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

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. Products with no reviews return an empty list. Costs extra page reads per product and adds the enrichment surcharge.

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

Cap on reviews fetched per product when Fetch reviews is on. Reviews come 10 per page, so a lower cap means fewer page reads. 0 = every review the site lists.

## `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).

## `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.

## `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/"
  ],
  "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/"
    ],
    "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/"],
    "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/"
  ],
  "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/DWHbdvvqB7nJhMYOU/openapi.json
