{
  "openapi": "3.0.1",
  "info": {
    "title": "Officeworks Australia Scraper Lite",
    "description": "Scrape Officeworks (officeworks.com.au) products: name, brand, title, price, GST, was/original price, deals and clearance specials, stock by state, images, variants, specifications, ratings and reviews. Search by keyword, specials or filters, or paste product, search or category URLs.",
    "version": "1.0",
    "x-build-id": "6iswGqnqJICcZqeWw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~officeworks-scraper-lite/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-officeworks-scraper-lite",
        "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~officeworks-scraper-lite/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-officeworks-scraper-lite",
        "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~officeworks-scraper-lite/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-officeworks-scraper-lite",
        "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": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Choose 'search' to use keywords and filters, or 'url' to scrape specific product, search or category URLs you paste below.",
            "default": "search"
          },
          "queries": {
            "title": "Search keywords",
            "type": "array",
            "description": "One or more keywords to search, for example 'laptop' or 'printer ink'. Each keyword is searched separately.",
            "items": {
              "type": "string"
            }
          },
          "specialsCategory": {
            "title": "Specials / offers collection",
            "enum": [
              "deals",
              "clearance"
            ],
            "type": "string",
            "description": "Optional. Scrape one of Officeworks' promotional collections instead of (or alongside) your keywords: Deals (curated featured offers) or Clearance (reduced-to-clear stock). Brand, price, rating filters and sort still apply. Leave empty to skip. Note: Officeworks uses an every-day-low-price model, so most products do not carry a strike-through 'was' price."
          },
          "urls": {
            "title": "Officeworks URLs",
            "type": "array",
            "description": "Product, search or category URLs to scrape, for example https://www.officeworks.com.au/shop/officeworks/p/some-product-sku, https://www.officeworks.com.au/shop/officeworks/search?q=laptop or https://www.officeworks.com.au/shop/officeworks/c/office-supplies/pens/ballpoint-pens. Multiple URLs supported.",
            "default": [
              "https://www.officeworks.com.au/shop/officeworks/search?q=laptop",
              "https://www.officeworks.com.au/shop/officeworks/search?q=laptop&page=2",
              "https://www.officeworks.com.au/shop/officeworks/c/office-supplies/pens/ballpoint-pens",
              "https://www.officeworks.com.au/shop/officeworks/c/office-supplies/pens/ballpoint-pens?page=2",
              "https://www.officeworks.com.au/shop/officeworks/c/art-supplies",
              "https://www.officeworks.com.au/shop/officeworks/p/mac-mini-m6-12-core-cpu-12-core-gpu-16-256gb-immm6162",
              "https://www.officeworks.com.au/shop/officeworks/search?q=IMMM6162",
              "https://www.officeworks.com.au/shop/officeworks/c/deals",
              "https://www.officeworks.com.au/shop/officeworks/c/clearance",
              "https://www.officeworks.com.au/shop/officeworks/p/JBCNCPA480"
            ],
            "items": {
              "type": "string"
            }
          },
          "brand": {
            "title": "Brand",
            "type": "string",
            "description": "Optional. Keep only products whose brand matches this value, for example 'HP' or 'Keji'."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "newest",
              "nameAsc",
              "priceAsc",
              "priceDesc",
              "ratingAsc",
              "ratingDesc"
            ],
            "type": "string",
            "description": "Ordering applied to the results by the store's product-search service.",
            "default": "relevance"
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Only keep products priced at or above this amount (AUD)."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Only keep products priced at or below this amount (AUD)."
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Optional. Only keep products with an average customer rating at or above this value (1 to 5)."
          },
          "includeOutOfStock": {
            "title": "Include unavailable products",
            "type": "boolean",
            "description": "Include products that are not currently available in-store or online. On by default; turn off to keep only available products.",
            "default": true
          },
          "detailEnrichment": {
            "title": "Fetch full product detail + reviews",
            "type": "boolean",
            "description": "For each product, also fetch the product page for the full description, feature bullets, specifications, identifiers and image gallery, plus the star-rating distribution and customer reviews. Adds one request per product, which consumes additional platform usage; there is no enrichment event fee. Turn off for a faster, lower-cost run that returns the listing card fields only (name, price, brand, aggregate rating and review count) with no reviews.",
            "default": true
          },
          "maxReviewsPerProduct": {
            "title": "Max reviews per product",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on reviews collected per product when detail enrichment is on. Use 0 for all available reviews, up to a hard cap of 1000 per product. Products with no reviews leave the review fields absent.",
            "default": 20
          },
          "maxItems": {
            "title": "Max products",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of products to return across the whole run. Use 0 for unlimited.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "Optional safety cap on result pages walked per keyword / URL. A pasted URL that names its own start page counts from that page (maxPages=2 on a page=5 URL walks pages 5-6). A resumed run counts from page 1 of the original run, so the cap is cumulative across resumes, not reset per run. Use 0 to walk every page (the run still stops automatically once Max products is reached, or once a page repeats or the store's own result total is reached).",
            "default": 0
          },
          "deliveryPostcode": {
            "title": "Delivery postcode",
            "pattern": "^[0-9]{4}$",
            "type": "string",
            "description": "Four-digit Australian postcode to check home delivery to, for example 4209. Needed when Check home delivery is on. Leave empty otherwise."
          },
          "verifyHomeDelivery": {
            "title": "Check home delivery live",
            "type": "boolean",
            "description": "For every returned product, ask the store whether it can be delivered to the delivery postcode right now, and add the delivery type, quantity, estimated arrival dates, click and collect and in-store quantities, and the postcode's delivery zone. The listing fields availableStates / availableOnline are index flags, not a delivery answer. A product whose answer cannot be read gets empty (null) delivery fields, never 'unavailable'. These lookups consume additional platform usage; there is no enrichment event fee. Requires a delivery postcode.",
            "default": false
          },
          "pickupStoreId": {
            "title": "Pickup store (optional)",
            "pattern": "^[Ww][0-9]{3}$",
            "type": "string",
            "description": "Optional store code, for example W444, whose click and collect and in-store quantities are reported. Ignored unless Check home delivery live is on. Leave empty to use the store nearest the delivery postcode. Delivery type, quantity and estimated arrival do not depend on the store."
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy is recommended for reliable results. On the free plan, coverage may be limited and some runs may return no results.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run (delta)",
            "type": "string",
            "description": "Optional. ID of a previous run of this actor (or a dataset ID). Products already in that dataset are skipped, so this run returns only NEW products (a delta). Combine both runs' datasets for the full set. Max products then counts only the new products. For recurring daily monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. UPDATED is driven by the product's own data (price, specials and promo label, stock and availability, name, brand, category, images and the other catalogue fields); rating, reviewCount, ratingDistribution, recommendedCount, reviewsCollected and reviews are excluded and never cause UPDATED. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those products returned. State is kept separately for each distinct search/filter setup (or by State key below).",
            "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 automatically from your search/filter/detail settings (switching Detail enrichment continues from the same search's saved baseline) — different searches then never mix state with each other."
          },
          "baselineDatasetId": {
            "title": "Start from an existing dataset (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Pick the dataset of an earlier run of this Actor (same search and settings) to use as your starting point, so your first incremental run returns only products that changed since then instead of the whole search again. Pick the dataset unedited: it must be this Actor's own product output. Only used on the first run for a state key; ignored once that state key already tracks products. Cannot be combined with Resume from a previous run. If the dataset is old, everything that changed since is returned as UPDATED or NEW."
          },
          "earlierHistoryStoreId": {
            "title": "Continue from the Officeworks Australia Scraper's history (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Pick the saved-history store of the Officeworks Australia Scraper (named officeworks-com-au-incremental-state) so your first Lite run for a State key, or for the same search settings, continues from the history that scraper already tracked, instead of returning the whole search as NEW. With an automatic key, the history saved under either Detail enrichment setting of the same search is used. The store is only read, never changed. Only used on the first run for a state key; ignored once Lite already tracks products for that key (or, with an automatic key, for the same search under the other Detail enrichment setting), or when Start from an existing dataset or Resume is set."
          },
          "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 extra rows you already have, so leave it off unless you specifically 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 — not when Max products or Max pages capped it, or when Resume was used. This returns extra synthetic rows.",
            "default": false
          },
          "changeScope": {
            "title": "What counts as a change (incremental mode only)",
            "enum": [
              "all",
              "priceAndStock",
              "sellingPriceAndStock"
            ],
            "type": "string",
            "description": "All fields (default): any change to the product record, except the always-ignored review fields, returns an UPDATED row. Price and availability only: only price changes (price, everyday price, was price, savings, special and clearance flags), stock changes (available online, states with stock, in-store availability) and a size or colour added to or removed from the product family return an UPDATED row; descriptions, images, specifications and other details never do. Selling price and availability only: like Price and availability only, but a price change counts only when the selling price (price) moves; the everyday price, was price, savings and special flags never return a row on their own. Every size or colour is its own product at Officeworks, so its own price and stock are compared on its own row. With Check home delivery live on, a change in whether the product can be delivered to your postcode returns an UPDATED row in every option. Changing this option keeps the saved baseline of your search: it never returns the whole search as NEW again.",
            "default": "all"
          },
          "compactUpdates": {
            "title": "Compact update rows (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. When on, UPDATED rows (and EXPIRED rows) are short: sku, url, name, brand, current price and stock, previousPrice, plus priceChanges (old and new value of each moved price or stock field), variantChanges (a size or colour added to or removed from the family) and, with Check home delivery live on, the delivery answer and deliveryChanges. NEW rows always carry the complete product record. Compact rows carry no product-page content (description, specifications, images, reviews).",
            "default": false
          },
          "expireAfterMissedScans": {
            "title": "Expire after N missed full scans (incremental mode only)",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Only used with Emit expired products. A product is marked EXPIRED only after it has been missing from this many full scans in a row (default 1). Raise it (e.g. 3) so a product that briefly drops out of a search or category listing is not reported as gone. A product that comes back resets the count. Stock and delivery status are reported through the availability and delivery fields, not through EXPIRED.",
            "default": 1
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional. Field names to leave out of UPDATED change detection, on top of the built-in handling (rating, reviewCount, ratingDistribution, recommendedCount, reviewsCollected and reviews never trigger UPDATED, since other customers change them without the product changing). Use a top-level name such as colour, or a dotted path such as images.url to ignore a nested field. Ignored fields are still returned, just not compared.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output. 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 item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}