{
  "openapi": "3.0.1",
  "info": {
    "title": "Home Hardware Canada Scraper — Store Prices, Sales & Stock",
    "description": "Home Hardware Canada products with store-level prices, sale prices and end dates, in-store and online stock, ratings, model numbers and Made-in-Canada flags. Search, categories, product watchlists and the ~990-store directory, by postal code or store. English and French.",
    "version": "0.1",
    "x-build-id": "Fqkv8au45pPzvfwAw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yugenox~home-hardware-canada-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yugenox-home-hardware-canada-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/yugenox~home-hardware-canada-scraper/runs": {
      "post": {
        "operationId": "runs-sync-yugenox-home-hardware-canada-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/yugenox~home-hardware-canada-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-yugenox-home-hardware-canada-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",
        "properties": {
          "mode": {
            "title": "What to scrape",
            "enum": [
              "auto",
              "search",
              "category",
              "products",
              "stores"
            ],
            "type": "string",
            "description": "Search: products matching your search terms. Category: the products in the categories you list, sub-categories included (read from Home Hardware's public category pages, which show at most 200 products each, so a very large category may come back incomplete; the status message says so). Product codes: a watchlist of specific products (price + stock at each store). Stores: the store directory (address, hours, services) for all ~990 stores, or only the stores nearest your postal codes / cities / store codes. Auto picks from what you fill in: product codes, then categories, then search terms.",
            "default": "auto"
          },
          "queries": {
            "title": "Search terms",
            "type": "array",
            "description": "Keywords, one per line, exactly as you would type them in the homehardware.ca search box (e.g. \"cordless drill\", \"snow shovel\", \"furnace filter 16x25\").",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Category page URLs from homehardware.ca (e.g. https://www.homehardware.ca/en/paint/c/1525535408186), or category names like \"Paint\", \"Hand Tools\", \"Snow Removal\". Sub-categories are included. Home Hardware's category pages show at most 200 products each, so for a bigger category the actor also reads its sub-categories; these don't always add up to the whole category, and the status message says when a result may be incomplete.",
            "items": {
              "type": "string"
            }
          },
          "productCodes": {
            "title": "Product codes",
            "type": "array",
            "description": "Home Hardware product codes (7 digits, e.g. 1239142 or 1239-142) or product page URLs (…/p/1239142). Returns the price, sale and stock of each product at every selected store.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Postal codes or cities",
            "type": "array",
            "description": "Canadian postal codes (M5V 2T6), cities (Kelowna, BC) or coordinates (43.64,-79.39). Each one is matched to its nearest Home Hardware store — prices and stock are store-specific. Leave empty (with no store codes) to use Home Hardware's default online store.",
            "items": {
              "type": "string"
            }
          },
          "storesPerLocation": {
            "title": "Stores per location",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many of the nearest stores to use for each postal code or city (1-50). Use this to compare prices across the stores in an area.",
            "default": 1
          },
          "storeCodes": {
            "title": "Store codes",
            "type": "array",
            "description": "Home Hardware store numbers (e.g. 13817). Run the Store directory mode once to get every store's code.",
            "items": {
              "type": "string"
            }
          },
          "allStores": {
            "title": "All stores",
            "type": "boolean",
            "description": "Run your search / categories / product codes at every Home Hardware, Home Hardware Building Centre and Home Building Centre store in Canada (~990 stores). Combine with Provinces to narrow it down. Rows = products x stores, so set a sensible maximum.",
            "default": false
          },
          "provinces": {
            "title": "Provinces",
            "type": "array",
            "description": "Only used with \"All stores\" and the Store directory: keep stores in these provinces / territories.",
            "items": {
              "type": "string",
              "enum": [
                "AB",
                "BC",
                "MB",
                "NB",
                "NL",
                "NS",
                "NT",
                "NU",
                "ON",
                "PE",
                "QC",
                "SK",
                "YT"
              ],
              "enumTitles": [
                "Alberta",
                "British Columbia",
                "Manitoba",
                "New Brunswick",
                "Newfoundland and Labrador",
                "Nova Scotia",
                "Northwest Territories",
                "Nunavut",
                "Ontario",
                "Prince Edward Island",
                "Quebec",
                "Saskatchewan",
                "Yukon"
              ]
            }
          },
          "language": {
            "title": "Language",
            "enum": [
              "en",
              "fr"
            ],
            "type": "string",
            "description": "Product names, categories and URLs in English or French.",
            "default": "en"
          },
          "sort": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "price_asc",
              "price_desc",
              "rating_asc",
              "rating_desc"
            ],
            "type": "string",
            "description": "Order of search and category results. Price and rating sorts are done by the actor: it looks up the listed products (up to 3,000 per search term or category) at your store and sorts them. If the run's timeout is too short to look them all up, you get the best of the products it checked and the status message starts with \"Partial\".",
            "default": "relevance"
          },
          "inStockOnly": {
            "title": "Available at the store only",
            "type": "boolean",
            "description": "Only products the selected store has on hand, or can sell when the store doesn't report its stock (like the site's \"Available in store\" filter).",
            "default": false
          },
          "onSaleOnly": {
            "title": "On sale only",
            "type": "boolean",
            "description": "Only products with a sale price at the selected store.",
            "default": false
          },
          "maxItemsPerQuery": {
            "title": "Max products per search / category / store",
            "minimum": 0,
            "type": "integer",
            "description": "Limit for each search term or category at each store. 0 = no limit (walk the whole listing).",
            "default": 120
          },
          "maxItems": {
            "title": "Max products in total",
            "minimum": 0,
            "type": "integer",
            "description": "Stop the run after this many rows. 0 = no limit.",
            "default": 1000
          },
          "dedupeAcrossQueries": {
            "title": "One row per product per store",
            "type": "boolean",
            "description": "If a product matches several of your search terms or categories, keep only its first row at each store. Turn off to get every search term's full result list (e.g. for search-rank tracking).",
            "default": true
          },
          "includeDescription": {
            "title": "Include product description",
            "type": "boolean",
            "description": "Add the marketing description of each product.",
            "default": false
          },
          "includeRaw": {
            "title": "Include raw data",
            "type": "boolean",
            "description": "Add the complete unprocessed product record under \"raw\" (large; for advanced use).",
            "default": false
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Parallel requests (1-10). The default is fast and stays under the site's bot protection.",
            "default": 6
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy is required. Datacenter proxies are used by default; blocked requests automatically retry on Canadian residential proxies.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}