{
  "openapi": "3.0.1",
  "info": {
    "title": "WooCommerce Scraper",
    "description": "Scrape products, variations, categories and customer reviews from any WooCommerce store. Detects each store's available data surface and adapts, so it works whether the JSON API is open, disabled, or behind a firewall.",
    "version": "0.0",
    "x-build-id": "dWpyiTMt7dCdQ8R39"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/autofacts~woocommerce-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-autofacts-woocommerce-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/autofacts~woocommerce-scraper/runs": {
      "post": {
        "operationId": "runs-sync-autofacts-woocommerce-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/autofacts~woocommerce-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-autofacts-woocommerce-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": {
          "startUrls": {
            "title": "WooCommerce store start URLs",
            "type": "array",
            "description": "Any WooCommerce store URL: the store root, a category page, a tag page, a search URL or a single product page. The scraper asks the store what a URL is, so you do not need to know how it configured its permalinks. Mix several stores in one run. To name stores by bare domain, use the <b>Store domains</b> field below instead.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "domains": {
            "title": "Store domains",
            "type": "array",
            "description": "Bare domains, one per line (<code>mystore.com</code>) — the simplest way to name whole stores. Each one is crawled like a start URL of <code>https://mystore.com/</code>. Can be combined with start URLs.",
            "items": {
              "type": "string"
            }
          },
          "maxProducts": {
            "title": "Max products",
            "minimum": 0,
            "type": "integer",
            "description": "How many product records to save in this run, across all stores. Each product is one billed result, so this is the run's cost cap for products. <code>0</code> = no limit — bound spend with the run's <b>Max total charge</b> setting instead. Categories and reviews are capped separately and never count against this number."
          },
          "maxProductsPerStore": {
            "title": "Max products per store",
            "minimum": 0,
            "type": "integer",
            "description": "Cap for each individual store in the run, so one large catalog cannot consume the whole budget before the next start URL is reached. <code>0</code> = no per-store limit. Two start URLs on the same store share one cap.",
            "default": 0
          },
          "includeVariations": {
            "title": "Include product variations",
            "type": "boolean",
            "description": "Fetch every variation of variable products (size/colour combinations) with its own SKU, price and stock, nested inside the product record. Variations are <b>not billed separately</b>, but they cost extra requests: stores average about 7 variations per variable product, so a variation-heavy catalog takes noticeably longer. When off, a variable product still produces one record with a single synthetic variant, and <code>extraInfo.variationsOmitted</code> reports how many were skipped.",
            "default": true
          },
          "includeReviews": {
            "title": "Include product reviews",
            "type": "boolean",
            "description": "Save customer reviews as separate <code>Review</code> records (rating, text, reviewer, verified-buyer flag, date), one per review, joined to the product by <code>productId</code>. Reviews are billed per review. Only available on stores with an open Store API — the HTML fallback has no review surface, and the run says so in its log rather than silently producing none.",
            "default": false
          },
          "maxReviewsPerProduct": {
            "title": "Max reviews per product",
            "minimum": 0,
            "type": "integer",
            "description": "Newest reviews to keep for each product. <code>0</code> = all of them. Review counts are unbounded — one surveyed store carries 15,152 reviews on 96 products — so keep this small unless reviews are what you came for.",
            "default": 20
          },
          "query": {
            "title": "Search query",
            "type": "string",
            "description": "Search term. Every store root or domain in the run is searched for it instead of being crawled whole, and a category or tag URL is searched within that category or tag. Requires a store with an open API — stores on the HTML fallback path have no search surface and report an error for that URL rather than silently crawling the whole catalog."
          },
          "allowHtmlFallback": {
            "title": "Allow HTML fallback for stores without an open API",
            "type": "boolean",
            "description": "A meaningful share of WooCommerce stores have their JSON API disabled or firewalled (28 of 53 stores had it open in our own 2026-09-03 survey). For those, the scraper falls back to parsing product pages directly. This works, but costs roughly <b>100x more requests and 15x more traffic per product</b> than the API path, so it is billed as a separate surcharge event and capped below. Turn this off to scrape only stores with an open API.",
            "default": true
          },
          "maxHtmlDetailRecords": {
            "title": "Max HTML-fallback records per run",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on how many products may be produced through the expensive HTML fallback path in one run. Only applies when the fallback is enabled. Set to <code>0</code> for unlimited.",
            "default": 200
          },
          "maxConcurrency": {
            "title": "Max concurrent requests",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Most WooCommerce stores are small self-hosted WordPress sites and start returning errors under load — the default of 2 is deliberately conservative and is what keeps runs from being throttled or blocked. Raise it only for stores you know are on serious hosting.",
            "default": 2
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Select proxies to be used by your crawler. The scraper escalates on its own when a store's firewall blocks a request, so datacenter proxies are a reasonable default — residential is only needed for the minority of heavily protected stores."
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of products to return. Hidden parameter, overrides maxProducts if set.",
            "default": 0
          },
          "maxRequestsPerCrawl": {
            "title": "Max products (deprecated name)",
            "minimum": 0,
            "type": "integer",
            "description": "Deprecated alias of maxProducts, kept so tasks saved before version 0.2.0 keep working. Ignored when maxProducts is set."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}