# Qoo10 Japan Products Scraper (price watch) (`superslowsloth/qoo10-products`) Actor

Search Qoo10 Japan (qoo10.jp) by keyword or search URL and get one flat row per product: goodscode, title, sale price and list price in JPY, discount, shop, rating, review count, shipping, image, sponsored flag and rank on the page.

- **URL**: https://apify.com/superslowsloth/qoo10-products.md
- **Developed by:** [Superslow Sloth](https://apify.com/superslowsloth) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 product scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Qoo10 Japan Products Scraper (price watch)

Search Qoo10 Japan (qoo10.jp) and get one flat row per product: no nested
objects, no HTML to strip yourself. Built for price watching and competitor
tracking. Give it keywords or search URLs and you get each product's sale
price, list price, discount, shop, rating, shipping and position on the page.

### Input

| field | meaning |
|---|---|
| `keywords` | One or more searches, exactly as typed into Qoo10's search box |
| `searchUrls` | Optional. Qoo10 search pages copied from your browser (`https://www.qoo10.jp/gmkt.inc/Search/Default.aspx?keyword=...`). Any sort or filter already in the URL is kept |
| `maxItems` | Stop after this many products in total, shared across every search, in order |
| `proxyConfiguration` | Apify datacenter proxy by default. See **Proxy** below |

### Output

| field | meaning |
|---|---|
| `goodscode` | Qoo10's own item number |
| `url`, `title` | Product page link and listing title |
| `brand` | Brand tag Qoo10 prints before the title, or `null` on an unbranded listing |
| `price_jpy` | The price the product sells at, in yen |
| `original_price_jpy` | The struck-through list price, when the seller shows one |
| `discount_jpy` | The yen discount Qoo10 prints next to it ("17,664円 ↓"), when it prints one |
| `discount_pct` | Worked out from the two prices above, to one decimal place. Qoo10's search page prints no percentage itself |
| `shop_name`, `shop_id`, `shop_url` | The seller's storefront |
| `seller_grade` | Qoo10's seller badge: "Power seller", "Good seller" or "General seller" |
| `rating` | Out of 5, read from the star bar (a bar 93% full reads as 4.65) |
| `review_count` | The review count printed next to the stars |
| `shipping_text` | The shipping caption as printed, e.g. `無料` (free) |
| `ships_from` | Ship-from country code: `JP`, `KR`, `CN`, ... |
| `image_url` | The product photo |
| `sponsored` | `true` for a paid placement: a row labelled "PR", or the keyword-plus ad block above the results |
| `placement` | Qoo10's own placement tag, verbatim: `goods`, `goods_power`, `cps_goods`, `keywordplus` |
| `page`, `rank` | Which page of the search the row was on, and its position on that page (ads included) |
| `query` | The keyword or search URL this row came from |

#### `null` is not zero

A column is `null` when that row of Qoo10's search page does not show it. The
actor never puts a `0` or an empty string in its place:

- `rating` and `review_count` are `null` on a row that shows no stars. That
  happened on 17 of 42 complete rows of an `iphone` search on 2026-10-04. A `0` would
  read as "rated zero" when the page gave no rating at all.
- `original_price_jpy`, `discount_jpy` and `discount_pct` are `null` when there
  is no struck-through price. Some rows show a list price without the yen
  figure next to it. On those rows only `discount_jpy` is `null`.
- `shipping_text` is `null` when the row prints no shipping caption. On Qoo10
  that means the fee is worked out at checkout. It does **not** mean shipping
  is free, so the actor does not report it as free.
- `brand` is `null` on listings with no brand tag.

### Paging

Qoo10's results page has no numbered page links. It ends in a "もっと見る"
(see more) button. The page keeps its place in a `curPage` field, shows 40
products per page and says how many pages exist (`totalPage`, which read 50 on
every search checked). The actor asks for `curPage=2`, `3` and so on. On every
later page it reads back the `curPage` Qoo10 actually served. If Qoo10 ignored
the request and sent page 1 again, the actor stops and says so in the run log.
It does not bill you for 50 copies of the same page. A product is charged once
per run, even when several searches or pages turn it up.

### Proxy

The default is Apify's datacenter proxy. Qoo10 served full result pages to
datacenter exits on 2026-09-30, 2026-10-01 and 2026-10-04. A direct request from
a residential address in Japan, with no Apify proxy, got Qoo10's "523 Error"
page every time on 2026-10-01 and 2026-10-04. That page arrives with HTTP status
200, so the actor checks the page body, not the status. A page with no search
results form counts as a refusal: the actor switches proxy address and retries.

### Billing

Pay per event: **$0.0007 per product**, plus **$0.002 per run** for actor-start.
Platform usage (compute, bandwidth, proxy) is included. You pay the two event
prices above and nothing else. A product turned up twice in one run is charged
once.

For comparison, the Apify Store's other Qoo10 scrapers charge $0.001 per item
(`trev0n/qoo10-japan-scraper`) and $0.003 per item (`cloud9_ai/qoo10-scraper`).
This actor's $0.0007 is 30% under the cheaper one.

# Actor input Schema

## `keywords` (type: `array`):

One or more searches, each exactly as you would type it into Qoo10's search box, e.g. "iphone" or "ポケモン". Every search shares the maxItems budget below, in the order given - so if the first one alone reaches maxItems, later ones are never fetched. Spellings that differ only in case are collapsed.

## `searchUrls` (type: `array`):

Optional. Qoo10 search pages copied from your browser, e.g. https://www.qoo10.jp/gmkt.inc/Search/Default.aspx?keyword=iphone - any sort or filter already in the URL is kept and the actor pages through it. Run after the keywords above, sharing the same maxItems budget. A URL that is not a Default.aspx search with a keyword is skipped and named in the run log.

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

Stop after this many products in total, shared across every search above. Qoo10 shows about 40 products per page (plus a few sponsored rows), so up to ~40 per search is one page request. Qoo10 itself stops paging at 50 pages, about 2,000 products per search.

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

Apify datacenter proxy is the default and is what the actor was measured on: qoo10.jp served full result pages to datacenter exits on 2026-09-30, 2026-10-01 and 2026-10-04. Residential works too but costs more and is not needed.

## Actor input object example

```json
{
  "keywords": [
    "iphone"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `products` (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 = {
    "keywords": [
        "iphone"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("superslowsloth/qoo10-products").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 = {
    "keywords": ["iphone"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("superslowsloth/qoo10-products").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 '{
  "keywords": [
    "iphone"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call superslowsloth/qoo10-products --silent --output-dataset

```

## MCP server setup

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

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/mQmUt5vK98HXDabgt/builds/vLhbrejLglhTXKJB1/openapi.json
