{
  "openapi": "3.0.1",
  "info": {
    "title": "WooCommerce Products API — Prices, Variants & Stock",
    "description": "Scrape any WooCommerce store's catalogue as data from its public Store API: name, SKU, price, sale price, stock count, variations, attributes, categories, tags and images. Give it a store URL — no API key, no browser, no plugin.",
    "version": "0.1",
    "x-build-id": "Lad27N4gtcahSGUCT"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/insight.solutions~woocommerce-products-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-insight.solutions-woocommerce-products-api",
        "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/insight.solutions~woocommerce-products-api/runs": {
      "post": {
        "operationId": "runs-sync-insight.solutions-woocommerce-products-api",
        "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/insight.solutions~woocommerce-products-api/run-sync": {
      "post": {
        "operationId": "run-sync-insight.solutions-woocommerce-products-api",
        "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": [
          "stores"
        ],
        "properties": {
          "stores": {
            "title": "WooCommerce stores",
            "type": "array",
            "description": "One entry per store. A bare domain (`barefootbuttons.com`), a full URL, or a link to any page of the shop — a product page, a category page, a link with tracking parameters — all work; the path is reduced to the store. A store installed in a subdirectory (`https://example.com/shop`) is tried there first, then at the root. Redirects are followed, and duplicates are read, and billed, once.",
            "items": {
              "type": "string"
            }
          },
          "search": {
            "title": "Search",
            "type": "string",
            "description": "Only products the store's own search matches (`search=`). WooCommerce searches names, descriptions and SKUs. Leave empty for the whole catalogue.",
            "default": ""
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Only products in these categories — each one is its own walk of the catalogue. Give category ids (`85`), slugs (`big-bore`), names (`Big Bore`) or category page URLs; anything but an id is looked up in the store's own category list (one extra request), and a name the store does not have comes back as a free row listing the ones it does. A product in two of your categories is returned once.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "onSaleOnly": {
            "title": "On-sale products only",
            "type": "boolean",
            "description": "Only products the store marks as on sale (`on_sale=true`).",
            "default": false
          },
          "onlyAvailable": {
            "title": "In-stock products only",
            "type": "boolean",
            "description": "Only products in stock (`stock_status=instock`) — and, with one row per variation, only variations in stock. Products on backorder are left out. The store applies the filter, and the Actor checks it again on what comes back, because older stores ignore filters they do not know.",
            "default": false
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "number",
            "description": "Only products priced at least this, in the store's own currency and in ordinary units (`9.95`, not cents). The Store API filters in the currency's minor units, so the Actor first reads one product to learn them (one small extra request per store). A variable product matches when any of its variations does."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "number",
            "description": "Only products priced at most this, in the store's own currency and in ordinary units."
          },
          "orderBy": {
            "title": "Sort order",
            "enum": [
              "date",
              "price",
              "price-desc",
              "popularity",
              "rating",
              "title"
            ],
            "type": "string",
            "description": "The order the store returns products in, which is also the order `rank` counts. `maxProductsPerStore` keeps the first N in this order — newest, cheapest, best-selling, best-rated.",
            "default": "date"
          },
          "rowPerVariant": {
            "title": "One row per variation",
            "type": "boolean",
            "description": "For every variable product, also return one row per variation — each size or colour with its own `variationId`, `variationAttributes`, SKU, price and stock — right after the product's own row, which is still returned. It costs one extra request per variable product, and variation rows are billed like product rows, so this is off by default. `maxProductsPerStore` still counts products, not rows.",
            "default": false
          },
          "includeCategories": {
            "title": "Include categories",
            "type": "boolean",
            "description": "Also return one row per product category in the store — name, slug, parent, product count, page and image — from one request. These are `rowType: \"category\"` rows, billed at $0.0005 each.",
            "default": false
          },
          "includeDescriptionHtml": {
            "title": "Include description HTML",
            "type": "boolean",
            "description": "Add `descriptionHtml`, the merchant's raw description markup, alongside the plain-text `descriptionText` (up to 20,000 characters) every row already carries. Page builders can make the markup many times the size of the words, so it is opt-in.",
            "default": false
          },
          "includeImages": {
            "title": "Include images",
            "type": "boolean",
            "description": "Fill in `images` — every image of the product with its URL and alt text. Off, rows keep `imageUrl`, the first image, which is a link rather than a payload. Nothing extra is fetched either way.",
            "default": true
          },
          "maxProductsPerStore": {
            "title": "Products per store",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "How many products to read from each store, in `orderBy` order. The Store API serves up to 100 per request, so a smaller number is also a smaller download: ask for 20 and the Actor asks the store for 20. Variation rows do not count towards it.",
            "default": 100
          },
          "maxConcurrency": {
            "title": "Stores in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many stores are read at once. Each parallel worker keeps its own proxy session, so a store that blocks one exit IP does not burn the others'. Requests to one store are spaced 300–600 ms apart and never more than two at a time — merchant servers are small — so this is the lever on speed for a long list.",
            "default": 3
          },
          "maxRunSecs": {
            "title": "Maximum run time (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "Wall-clock budget for the whole run. When it is reached the Actor stops, keeps and bills for every row it already wrote, and files a free `deadline` row for each store it cut short or never reached.",
            "default": 240
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "The Store API is served by each merchant's own WordPress, which answers anyone, so this Actor defaults to Apify's datacenter proxy — the cheap one — and its cost is inside the per-product price. A store behind a firewall that refuses datacenter ranges comes back as a free `blocked` row; switching this to the RESIDENTIAL group is the fix. Sessions rotate automatically when an exit IP is refused.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}