{
  "openapi": "3.0.1",
  "info": {
    "title": "Japan Knife Restock & Price Monitor",
    "description": "Monitor Japanese kitchen-knife stores (Sakai Ichimonji Mitsuhide global & Japan, Kama-asa Kappabashi): back in stock, sold out, price changes and new knives per blade length, with knife type, steel and finish fields.",
    "version": "0.0",
    "x-build-id": "Aq201NPJPzN5Lpu9r"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/datalab-jp~japan-handmade-knife-restock-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-datalab-jp-japan-handmade-knife-restock-monitor",
        "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/datalab-jp~japan-handmade-knife-restock-monitor/runs": {
      "post": {
        "operationId": "runs-sync-datalab-jp-japan-handmade-knife-restock-monitor",
        "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/datalab-jp~japan-handmade-knife-restock-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-datalab-jp-japan-handmade-knife-restock-monitor",
        "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",
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "changes",
              "snapshot"
            ],
            "type": "string",
            "description": "What to return: 'changes' = only what changed since the previous run (restocked, sold_out, price_up, price_down, new_product, new_variant, removed); 'snapshot' = every matching variant with current price and stock. In 'changes' mode the first run per store saves a baseline and returns rows as 'first_run'; schedule later runs to get only changes. Defaults to 'snapshot' when omitted. Both modes compare with and update the state in `stateStoreName`.",
            "default": "snapshot"
          },
          "stores": {
            "title": "Knife stores",
            "uniqueItems": true,
            "type": "array",
            "description": "Japanese knife stores to read, e.g. ['kama-asa'] or ['ichimonji-global', 'kama-asa']. Only stores whose terms of use do not restrict this use are supported: Sakai Ichimonji Mitsuhide global store (English titles), its Japan store (Japanese titles) and Kama-asa (Kappabashi, Tokyo). Defaults to all 3 when omitted. Each store's whole public catalogue is read once per run (2–3 requests) and the filters are applied afterwards; stores are processed in the listed order.",
            "items": {
              "type": "string",
              "enum": [
                "ichimonji-global",
                "ichimonji-japan",
                "kama-asa"
              ],
              "enumTitles": [
                "Sakai Ichimonji Mitsuhide – global store (EN)",
                "Sakai Ichimonji Mitsuhide – Japan store 堺一文字光秀",
                "Kama-asa 釜浅商店 (Kappabashi)"
              ]
            },
            "default": [
              "ichimonji-global",
              "ichimonji-japan",
              "kama-asa"
            ]
          },
          "itemCategories": {
            "title": "Item categories",
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only these kinds of items, e.g. ['knife'] or ['knife', 'whetstone']. The category is assigned from each store's product type, tags and title; a knife sold with a saya stays 'knife'. Defaults to ['knife'] when omitted; pass [] for every item including saya, accessories, cookware and repair services. Kama-asa also sells pots and grills ('cookware').",
            "items": {
              "type": "string",
              "enum": [
                "knife",
                "whetstone",
                "saya_case",
                "accessory",
                "cookware",
                "service",
                "event",
                "gift_card",
                "other"
              ],
              "enumTitles": [
                "Knives",
                "Whetstones & sharpeners",
                "Saya & knife cases",
                "Kitchen accessories (chopsticks, boards, tweezers…)",
                "Cookware (pots, grills… mostly Kama-asa)",
                "Repair / re-handle / engraving services",
                "Classes & events",
                "Gift cards",
                "Other"
              ]
            },
            "default": [
              "knife"
            ]
          },
          "knifeTypes": {
            "title": "Knife types (optional)",
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only these knife shapes, e.g. ['gyuto', 'santoku'] or ['yanagiba', 'deba', 'usuba'] for traditional single-bevel knives. The type is read from Japanese and English titles (牛刀 = gyuto, 柳刃 = yanagiba), so it works across all stores. Defaults to no knife-type filter. Non-knife rows have knifeType null and are dropped when this filter is set.",
            "items": {
              "type": "string",
              "enum": [
                "gyuto",
                "santoku",
                "petty",
                "nakiri",
                "usuba",
                "deba",
                "yanagiba",
                "takobiki",
                "fugubiki",
                "sujihiki",
                "honesuki",
                "garasuki",
                "chinese_cleaver",
                "bread",
                "menkiri",
                "unagisaki",
                "honekiri",
                "kenmuki",
                "maguro",
                "funayuki",
                "ajikiri",
                "bunka",
                "kiritsuke",
                "other"
              ],
              "enumTitles": [
                "Gyuto 牛刀 (chef)",
                "Santoku 三徳",
                "Petty / paring ペティ",
                "Nakiri 菜切",
                "Usuba 薄刃",
                "Deba 出刃 (incl. mioroshi)",
                "Yanagiba 柳刃 (incl. kiritsuke-yanagi)",
                "Takobiki 蛸引",
                "Fugubiki ふぐ引",
                "Sujihiki 筋引 (slicer)",
                "Honesuki 骨スキ (boning)",
                "Garasuki ガラスキ",
                "Chinese cleaver 中華包丁",
                "Bread knife パン切",
                "Menkiri 麺切 (noodle)",
                "Unagisaki うなぎ裂",
                "Honekiri 骨切 (hamo)",
                "Kenmuki ケンムキ",
                "Maguro まぐろ切 (tuna)",
                "Funayuki 舟行",
                "Ajikiri アジ切",
                "Bunka 文化",
                "Kiritsuke 切付 (other)",
                "Other knife"
              ]
            },
            "default": []
          },
          "steels": {
            "title": "Steels (optional)",
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only knives whose title names one of these steels, e.g. ['white_2', 'blue_2'] or ['vg10']. Japanese and English names are unified (白二鋼 / 白紙2号 / White Steel #2 = white_2). Defaults to no steel filter. Store-brand steels whose composition the store does not state (e.g. FV10, 特鋼) have steel null and are dropped when this filter is set; 'white' / 'blue' mean the title did not state the grade.",
            "items": {
              "type": "string",
              "enum": [
                "white_1",
                "white_2",
                "white_3",
                "white",
                "blue_super",
                "blue_1",
                "blue_2",
                "blue",
                "ginsan",
                "vg10",
                "vg1",
                "sg2",
                "powder_hss",
                "chromax",
                "hap40",
                "zdp189",
                "aus10",
                "aus8",
                "sld",
                "sk",
                "swedish",
                "molybdenum",
                "stainless"
              ],
              "enumTitles": [
                "White #1 白一鋼/白紙1号",
                "White #2 白二鋼/白紙2号",
                "White #3 白紙3号",
                "White (grade not stated) 白鋼/白紙",
                "Blue Super 青紙スーパー",
                "Blue #1 青一鋼/青紙1号",
                "Blue #2 青二鋼/青紙2号",
                "Blue (grade not stated) 青鋼/青紙",
                "Ginsan 銀三",
                "VG-10 V金10号",
                "VG-1 V金1号",
                "SG2 / R2",
                "Powder HSS 粉末ハイス",
                "Chromax クロマックス",
                "HAP40",
                "ZDP-189",
                "AUS-10",
                "AUS-8",
                "SLD",
                "SK carbon steel",
                "Swedish steel",
                "Molybdenum stainless モリブデン",
                "Stainless (type not stated)"
              ]
            },
            "default": []
          },
          "minPrice": {
            "title": "Min price",
            "minimum": 0,
            "type": "integer",
            "description": "Drop variants cheaper than this price, e.g. 20000 (yen) or 150 (US dollars). The comparison uses each row's own `currency`: the Japan stores answer in JPY, while the global Ichimonji store answered in USD in testing (Shopify picks the currency per visitor). Defaults to no minimum when empty. Removed rows are judged by their last known price."
          },
          "maxPrice": {
            "title": "Max price",
            "minimum": 0,
            "type": "integer",
            "description": "Drop variants more expensive than this price, e.g. 30000 (yen) or 300 (US dollars). The comparison uses each row's own `currency` (JPY at the Japan stores; the global store answered in USD in testing), so combine it with `stores` when you mix stores. Defaults to no maximum when empty. Must be greater than or equal to `minPrice`."
          },
          "keywords": {
            "title": "Keywords (optional)",
            "type": "array",
            "description": "Keep only products whose title, size, type, vendor, tags or SKU contain any of these words, e.g. ['Kirameki'] or ['中川', '本焼']. The Japan stores use Japanese titles, the global store English ones; knife and steel words (gyuto→牛刀, 柳刃→Yanagiba, white steel→白鋼, 三德→三徳) are retried with a verified alias when they match nothing in a store. Defaults to no keyword filter. Combined with the other filters (all must match).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "changeTypes": {
            "title": "Change types to return",
            "uniqueItems": true,
            "type": "array",
            "description": "In 'changes' mode, return only these kinds of change, e.g. ['restocked'] for back-in-stock alerts or ['price_up', 'price_down'] for price tracking. A row matches if any of its changes is listed (a size can be restocked and repriced at once). Defaults to all change types when empty. Ignored in 'snapshot' mode; changes filtered out here are still recorded in the state and are not reported again.",
            "items": {
              "type": "string",
              "enum": [
                "new_product",
                "new_variant",
                "restocked",
                "sold_out",
                "price_up",
                "price_down",
                "removed",
                "first_run"
              ],
              "enumTitles": [
                "New product",
                "New size/variant",
                "Back in stock",
                "Sold out",
                "Price increase",
                "Price decrease",
                "Removed from store",
                "First run (baseline)"
              ]
            },
            "default": []
          },
          "onlyAvailable": {
            "title": "Only in-stock items (snapshot)",
            "type": "boolean",
            "description": "In 'snapshot' mode, drop variants that are currently sold out, e.g. to list only knives that can be ordered right now. Availability is the store's own in-stock flag for each blade length / option. Defaults to false (sold-out variants are included with available=false). Ignored in 'changes' mode, where sell-outs are reported as 'sold_out' events.",
            "default": false
          },
          "maxItems": {
            "title": "Max rows",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Maximum rows for the whole run, e.g. 100 for a quick check or 2000 for every knife in every store (about 1,660 knife variants in October 2026). Each row is one billable result, so this is your cost cap; it is shared fairly between the selected stores. Defaults to 100 when omitted; accepts 1–20000. If a store's change output is cut off, its state is not updated, so the missing changes come next run (a first-run baseline is always saved in full).",
            "default": 100
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Name of the key-value store in YOUR Apify account that keeps the previous run's prices and stock, e.g. 'japan-knife-restock-monitor' or 'gyuto-restock-alerts'. Letters, digits and hyphens only (max 63). Defaults to 'japan-knife-restock-monitor'. Use a different name for each schedule with different filters so one monitor does not consume another's changes; a new name starts a new baseline.",
            "default": "japan-knife-restock-monitor"
          },
          "autoRetryKeywordMapping": {
            "title": "Retry zero-hit keywords with aliases",
            "type": "boolean",
            "description": "When a keyword matches nothing in a store, retry it once with a verified alias, e.g. 'gyuto' → '牛刀' on a Japanese store or '柳刃' → 'Yanagiba' on the global store. Only aliases checked against real store titles are used. Defaults to true. The run log and the RUN_REPORT record show which word was actually used for each store.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy for reading the stores' public product feeds, e.g. {'useApifyProxy': true} (Apify datacenter proxy) or {'useApifyProxy': false} (direct). Shopify rate-limits per IP and has answered HTTP 429 to busy cloud IPs, so the datacenter proxy is on by default. Defaults to Apify datacenter proxy; residential proxy is not needed. Requests go one at a time with pauses and automatic retries on 429.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}