{
  "openapi": "3.0.1",
  "info": {
    "title": "Yodobashi Scraper: Prices, Points, Specs & Reviews",
    "description": "Scrape yodobashi.com electronics and appliances: JPY price, list price and discount, reward points, stock and delivery, images, specifications, variants and customer reviews. Search by keyword with the store's own category, brand, price and sort filters, or paste product, category and search URLs.",
    "version": "1.0",
    "x-build-id": "tYqCp9tLeXv08JgO6"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~yodobashi-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-yodobashi-com-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/abotapi~yodobashi-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-yodobashi-com-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/abotapi~yodobashi-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-yodobashi-com-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Search mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "How to find products. 'search' runs keyword searches with the store's own filters; 'url' takes Yodobashi product, category, brand or search URLs exactly as you paste them.",
            "default": "search"
          },
          "queries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Keywords to search for (Search mode only). Japanese and English both work. Each keyword runs its own paginated search and the results are combined. Leave empty if you only want to browse a category or a brand.",
            "items": {
              "type": "string"
            }
          },
          "categoryPath": {
            "title": "Category branch",
            "type": "string",
            "description": "Restrict the search to one category branch (Search mode only). Paste a Yodobashi category URL, its id path (for example 19055/19063/206005 from https://www.yodobashi.com/category/19055/19063/206005/), or the category's exact name as shown on the site, such as デジタルカメラ (letter case and full-width or half-width forms do not matter; no fuzzy match). A name that matches nothing, or two different categories, stops the run with a clear NAME_NOT_RESOLVED message. Leave empty to search the whole store."
          },
          "makerId": {
            "title": "Brand / maker id",
            "type": "string",
            "description": "Restrict the search to one brand (Search mode only). Enter the 10-digit maker id from a Yodobashi brand link (for example 0000001851 from https://www.yodobashi.com/maker/0000001851/), or the brand's exact name as shown on the site, such as パナソニック or ASUS (letter case and full-width or half-width forms do not matter; no fuzzy match). A name that matches nothing stops the run with a clear NAME_NOT_RESOLVED message. Leave empty for all brands."
          },
          "minPrice": {
            "title": "Minimum price (JPY)",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest price to include, in Japanese yen (Search mode only). Leave empty for no minimum."
          },
          "maxPrice": {
            "title": "Maximum price (JPY)",
            "minimum": 0,
            "type": "integer",
            "description": "Highest price to include, in Japanese yen (Search mode only). Leave empty for no maximum."
          },
          "sortBy": {
            "title": "Sort results by",
            "enum": [
              "",
              "popularity",
              "newest",
              "price_asc",
              "price_desc",
              "release_date_desc"
            ],
            "type": "string",
            "description": "Result ordering as offered by the store (Search mode only). Leave on the store default to keep Yodobashi's own popularity ranking.",
            "default": ""
          },
          "includeDiscontinued": {
            "title": "Include discontinued products",
            "type": "boolean",
            "description": "Off by default, matching the store's own default of hiding products it no longer sells. Turn on to also return discontinued items, which widens the result set considerably.",
            "default": false
          },
          "urls": {
            "title": "Yodobashi URLs",
            "type": "array",
            "description": "Paste Yodobashi URLs (URL mode only). A product page (/product/<id>/) returns that one product; a category, brand or keyword-search URL returns the products it lists, up to your limits below. The filters above are ignored here because your URL already carries its own. If you leave this field out of the input in URL mode (for example in an API call that omits it), the built-in example of each supported link type runs; an empty list runs nothing. The shipped default list holds one example of each distinct link type, so each example returns its own products (the /p2/ example starts from page 2 of the same keyword search as the page 1 example). The suggestion list also offers the legacy /ec/product/<id>/ form and the /product-detail/<id>/ form, which point at the same product as /product/<id>/ and return it once, and a category page-N link with a search word. Product links in the /review/ and sp. mobile forms are read as the plain product page. Links that cannot be served (a category page-N link without a search word, an sp. listing link, another domain, an unrecognised shape) are skipped and reported with an UNSUPPORTED_URL warning in the run log.",
            "default": [
              "https://www.yodobashi.com/?word=%E3%82%AB%E3%83%A1%E3%83%A9",
              "https://www.yodobashi.com/product/100000001000045035/",
              "https://www.yodobashi.com/category/19055/19063/206005/",
              "https://www.yodobashi.com/p2/?word=%E3%82%AB%E3%83%A1%E3%83%A9",
              "https://www.yodobashi.com/category/19055/?word=%E3%82%AB%E3%83%A1%E3%83%A9",
              "https://www.yodobashi.com/?word=%E3%82%AB%E3%83%A1%E3%83%A9&lower=10000&upper=50000&sorttyp=SELL_PRICE_ASC",
              "https://www.yodobashi.com/maker/0000001851/",
              "https://www.yodobashi.com/?mkrbrnds=0000001881&word=%E3%82%AB%E3%83%A1%E3%83%A9",
              "https://www.yodobashi.com/category/19055/m0000001851/",
              "https://www.yodobashi.com/?word=%E3%82%AB%E3%83%A1%E3%83%A9&discontinued=true"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Maximum products",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on the number of products returned across all keywords and URLs combined. Set 0 for unlimited, bounded only by Max pages and by how many products the store actually has.",
            "default": 50
          },
          "maxPages": {
            "title": "Maximum pages per search or URL",
            "minimum": 0,
            "type": "integer",
            "description": "Optional bound on the number of result pages read per keyword or URL. Yodobashi shows up to 48 products per page. Leave empty or 0 for no page limit."
          },
          "fetchDetails": {
            "title": "Fetch full product details",
            "type": "boolean",
            "description": "Adds the full description, the complete specification table, the whole image gallery with captions, list price and discount, category rankings, and per-variant price, points and stock. Slower, and each enriched product adds one enrichment charge.",
            "default": false
          },
          "fetchReviews": {
            "title": "Fetch customer reviews",
            "type": "boolean",
            "description": "Also returns the product's customer reviews: star rating breakdown, and per-review author, star rating, posted date, review text, helpful votes and stated purchase reason. A product with no reviews returns an empty list. Counts towards the same per-product enrichment charge.",
            "default": false
          },
          "maxReviewsPerProduct": {
            "title": "Maximum reviews per product",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Cap on review rows attached to each product. Yodobashi server-renders its 20 most recent reviews per product page, so 20 is the practical ceiling and 0 means no cap (still at most 20); the product's full review count is always reported separately.",
            "default": 20
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Leave the default Apify Proxy setting on: datacenter proxies work for this store, residential is optional, and a country pin is not required. Apify free plans include no Apify Proxy: the run then continues on a backup connection with a notice in the log, or stops with a clear message if no page loads. To get proxy access, upgrade your plan or supply your own proxy URLs here.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from run ID",
            "type": "string",
            "description": "Optional: paste a previous run ID (or dataset ID) from this actor. Products already collected there are skipped, so this run returns only the new ones. Leave empty for a normal run. For recurring monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for recurring monitoring of the same search or URLs. The first run returns everything as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED products. UPDATED means any returned field changed except the excluded ones: for example price, list price, discount, availability, stock count, rating, review count, description, specifications, images, variants, new or edited review text and the title and brand fields. Excluded (still returned in the row, never a reason to mark UPDATED): delivery date, type, message and badge (also inside variants), category rankings, the sponsored flag, the scrape timestamp, each review's helpful, vote, like and comment counters, and the order of a review's purchase reasons. State is kept separately per search (keywords or links, category, brand, price range, sort, discontinued, details and reviews switches); changing Change scope or Ignore fields keeps it. Use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from run ID above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "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 from the search and filter settings, so different searches never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged products (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired products (incremental mode only)",
            "type": "boolean",
            "description": "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, so never when Max products or Max pages capped it, when Resume was used, or when a page could not be read. This returns, and bills, extra synthetic rows.",
            "default": false
          },
          "changeScope": {
            "title": "Change scope (incremental mode only)",
            "enum": [
              "all",
              "priceAndStock"
            ],
            "type": "string",
            "description": "All fields (default) marks a product UPDATED when any compared field changes. Price and availability only compares just the price, list price, discount, availability, in-stock flag and store stock count (also per variant) so image, description and rating changes never create a billable row.",
            "default": "all"
          },
          "compactUpdates": {
            "title": "Compact UPDATED rows (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to return UPDATED and EXPIRED rows as slim rows: product id, URL, title, current price and availability, plus priceChanges and variantChanges with the old and new values. NEW rows stay complete. A compact row carries no detail-only data, so it does not add a Detail enrichment charge.",
            "default": false
          },
          "expireAfterMissedScans": {
            "title": "Expire after missed scans (incremental mode only)",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "With Emit expired products on, a product is marked EXPIRED only after it was missing from this many consecutive complete scans (default 1). EXPIRED means it was no longer found in the listing; without opening each product page a listing drop and a delisting look the same, so check the availability fields for stock.",
            "default": 1
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Field names that must not make a product UPDATED, for example goldPoints or reviewCount. A dotted path such as variants.image ignores that key inside every variant while the rest of each variant is still compared. The fields stay in the returned row. Changing this list keeps your saved state: stored products are compared again under the current list, so it never causes a wave of UPDATED rows.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into 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 product, 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": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which product pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max products to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on products written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}