{
  "openapi": "3.0.1",
  "info": {
    "title": "Costco AU Scraper - Products, Prices & Reviews",
    "description": "Scrape Costco.com.au products by keyword or product, search and category URLs. Extract prices, brands, ratings, review counts and text, stock, images, specifications, promotions and full product details in clean structured data.",
    "version": "1.1",
    "x-build-id": "NQnQe7f87Lu4ICIhm"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~costco-au-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-costco-au-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/abotapi~costco-au-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-costco-au-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/abotapi~costco-au-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-costco-au-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Choose 'search' to use keywords and filters, or 'url' to scrape specific Costco Australia 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 'olive oil'. Each keyword is searched separately.",
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "price_asc",
              "price_desc",
              "name_asc",
              "name_desc",
              "best_selling",
              "top_rated",
              "top_sellers"
            ],
            "type": "string",
            "description": "Result ordering.",
            "default": "relevance"
          },
          "specialsCategory": {
            "title": "Specials / offers",
            "enum": [
              "",
              "hot_buys",
              "last_chance",
              "new"
            ],
            "type": "string",
            "description": "Optional. Limit results to one of Costco Australia's promotional collections: Hot Buys (current member savings), Last Chance (clearance) or New arrivals. Combine with a keyword, brand or category to narrow further, or paste a specials URL in URL mode. Discounted products carry the original 'was' price, savings amount and percent.",
            "default": ""
          },
          "brand": {
            "title": "Brand",
            "type": "string",
            "description": "Optional. Limit results to a single brand exactly as it appears in the results, for example 'HP' or 'Kirkland Signature'."
          },
          "category": {
            "title": "Category code",
            "type": "string",
            "description": "Optional. Limit results to a category by its code (for example 'cos_9'). You can read a category code from a category page URL (the part after /c/)."
          },
          "categoryCode": {
            "title": "Category code or URL",
            "type": "string",
            "description": "Optional alias of Category code that also accepts a pasted category page URL (the part after /c/ is used). Also accepts a parent category code to cover its whole subtree."
          },
          "parentId": {
            "title": "Parent category code",
            "type": "string",
            "description": "Optional. Browse everything under a parent category code (its direct children and deeper levels)."
          },
          "filters": {
            "title": "Facet filters",
            "type": "array",
            "description": "Optional. Site facet filters as 'FacetName:FacetValue' (for example 'Brand:Apple'). Values are case-sensitive and must match the site's own facet value exactly; a value the site does not list returns no products.",
            "items": {
              "type": "string"
            }
          },
          "rawQuery": {
            "title": "Raw query expression",
            "type": "string",
            "description": "Advanced. A raw storefront query expression ('text:sort:facet:value'), used as-is instead of the keyword, sort, category and filter inputs."
          },
          "productCode": {
            "title": "Product code or URL",
            "type": "string",
            "description": "Optional. Fetch one product by its numeric code (for example 126124) or the full product page link ending in /p/<code> (runs in URL mode and ignores the other search inputs). A page slug on its own is rejected."
          },
          "minRating": {
            "title": "Minimum average rating",
            "enum": [
              "0",
              "3",
              "4",
              "5"
            ],
            "type": "string",
            "description": "Optional. Only keep products whose average customer rating is at least this many stars (1-5).",
            "default": "0"
          },
          "urls": {
            "title": "Costco Australia URLs",
            "type": "array",
            "description": "Costco Australia links to scrape: search pages (text= or q= facet links, page= sets the start page), product pages (/p/<code>), category pages (/c/<code>), specials collections (/hot-buys/c/hot-buys, /c/last-chance, /c/new) and API search or product links. Multiple URLs supported. Each link gets an equal share of Max products, so left unedited a small sample of each shape is scraped.",
            "default": [
              "https://www.costco.com.au/Computers/Computer-Accessories/Cables-Accessories/mbeat-Stage-S6-Adjustable-Elevated-Laptop-Stand/p/126124",
              "https://www.costco.com.au/p/50250",
              "https://www.costco.com.au/rest/v2/australia/products/53346?fields=FULL",
              "https://www.costco.com.au/search?text=laptop",
              "https://www.costco.com.au/Tyres-Automotive/c/cos_9",
              "https://www.costco.com.au/c/cos_22",
              "https://www.costco.com.au/hot-buys/c/hot-buys",
              "https://www.costco.com.au/c/last-chance",
              "https://www.costco.com.au/search?q=laptop%3Arelevance%3Acategory%3Acos_22.15.4",
              "https://www.costco.com.au/search?text=tv&page=1",
              "https://www.costco.com.au/rest/v2/australia/products/search?query=laptop:relevance&currentPage=1&pageSize=2&fields=FULL",
              "https://www.costco.com.au/rest/v2/australia/products/search?query=:price-asc:allCategories:hot-buys&currentPage=1&pageSize=2"
            ],
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Minimum price (AUD)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Only keep products priced at or above this amount. Applied to each product's visible price."
          },
          "maxPrice": {
            "title": "Maximum price (AUD)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Only keep products priced at or below this amount."
          },
          "fetchDetails": {
            "title": "Fetch product details",
            "type": "boolean",
            "description": "Fetch each product's full detail (long description, ingredients, specifications, warranty, returns, all images, category path). Adds one request per product.",
            "default": true
          },
          "fetchReviews": {
            "title": "Fetch customer reviews",
            "type": "boolean",
            "description": "Also collect customer reviews for each product (star rating, title, author, date, review text, helpful votes) plus aggregate rating statistics. Adds requests per product.",
            "default": false
          },
          "maxReviewsPerProduct": {
            "title": "Max reviews per product",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on reviews collected per product when 'Fetch customer reviews' is on. Use 0 for the hard ceiling of 1000 reviews per product.",
            "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 the hard ceiling of 100000 products.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "Optional cap on result pages walked per keyword/URL. Leave at 0 to walk every page the site actually has (the run also stops once Max products is reached).",
            "default": 0
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy is recommended for reliable results. The default shared pool is cheapest and works for most runs; the actor elevates to an Australian residential exit on its own when needed.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large crawl of products without returning or charging for products already collected there. Use this after an interrupted run, or when continuing a product pull in another run. For recurring 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. 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 (and billed). State is kept separately per search/URL and filter/detail/review setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "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 the search/URL and filter/detail/review settings — different searches then never mix state with each other."
          },
          "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 — and bills — 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 capped it or when Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional. Field names that must NOT trigger UPDATED or appear in changedFields, in addition to the built-in handling (embedded reviews never trigger UPDATED). Use a top-level name such as promotions, or a dotted path for a nested field such as specs.value (applies to every list element). The ignored fields stay in the output; only change detection skips them. Saved state is re-evaluated with your current list, so editing it causes no one-off wave of UPDATED rows.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}