{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Products Scraper",
    "description": "Products, variants and collections from any Shopify store. Checks each store's own robots.txt before the first request, and fetches the currency from meta.json - the products endpoint carries prices with no currency anywhere in the payload.",
    "version": "0.1",
    "x-build-id": "ShiYL67A3NPCYUtGN"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapyx~shopify-products-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapyx-shopify-products-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/scrapyx~shopify-products-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapyx-shopify-products-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/scrapyx~shopify-products-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapyx-shopify-products-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 collect",
            "enum": [
              "products",
              "collections"
            ],
            "type": "string",
            "description": "products = every product in the store (or in one collection). collections = the store's collection list, optionally with a real product count for each.",
            "default": "products"
          },
          "storeDomains": {
            "title": "Shopify store domains",
            "type": "array",
            "description": "A domain (gymshark.com) or any URL on the store. Each store's own robots.txt is checked before a single product request is made — store domains are your input, and at least one real store (shop.tesla.com) forbids this exact endpoint with Disallow: /*.json.",
            "items": {
              "type": "string"
            }
          },
          "collectionHandle": {
            "title": "Only this collection",
            "type": "string",
            "description": "products mode only. The handle from a collection URL, e.g. 'mens-shorts' from /collections/mens-shorts. Note Shopify answers an UNKNOWN handle with HTTP 200 and an empty list — identical to a genuinely empty collection — so the summary reports collectionReturnedNothing rather than guessing which it was."
          },
          "maxProductsPerStore": {
            "title": "Max products (or collections) per store",
            "minimum": 0,
            "type": "integer",
            "description": "Set 0 for unlimited. Large stores are big — one measured store publishes 9,597 products across 39 pages. The summary reports completenessRatio against the store's own published count so you can see how much you got.",
            "default": 250
          },
          "pageSize": {
            "title": "Items per request",
            "minimum": 1,
            "maximum": 250,
            "type": "integer",
            "description": "Between 1 and 250. Shopify silently clamps anything above 250 — 251, 500 and 1000 all return a byte-identical 250-item response with no error.",
            "default": 250
          },
          "fetchStoreMeta": {
            "title": "Fetch store currency and totals",
            "type": "boolean",
            "description": "STRONGLY RECOMMENDED. /products.json contains NO CURRENCY anywhere — a variant says \"price\": \"44.00\" and nothing more. This costs one request per store and supplies the currency, money format, store name, myshopify domain and the store's own published-product count. With it off, every price is published with currency: null rather than a guess.",
            "default": true
          },
          "includeVariantRows": {
            "title": "One row per variant",
            "type": "boolean",
            "description": "Emit a VARIANT row per SKU with its own price, compare-at price, availability and option values, alongside the PRODUCT rows. A store with 250 products can easily have 1,500 variants.",
            "default": false
          },
          "includeDescriptionHtml": {
            "title": "Include the HTML description",
            "type": "boolean",
            "description": "body_html is by far the largest field in the payload and most listings never use it, so it is dropped by default rather than silently truncated.",
            "default": false
          },
          "countCollectionProducts": {
            "title": "Count each collection's products for real",
            "type": "boolean",
            "description": "collections mode only. Shopify's own products_count OVER-COUNTS what the JSON endpoint will serve — measured claims of 21, 72, 96, 150, 398 and 462 against 1, 12, 62, 69, 115 and 148 actually served, because it counts products not published to the online store. This walks each collection to get the real figure. Costs one or more requests per collection.",
            "default": false
          },
          "respectRobotsTxt": {
            "title": "Respect each store's robots.txt",
            "type": "boolean",
            "description": "Always on and cannot be disabled. Kept visible so the behaviour is stated rather than implied.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrent requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Stores in flight at once. Pages within one store are sequential.",
            "default": 3
          },
          "minRequestInterval": {
            "title": "Min seconds between request starts",
            "minimum": 0,
            "maximum": 30,
            "type": "integer",
            "description": "Politeness pacing shared across all workers. 0 uses the built-in default.",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional and OFF by default. Storefront JSON is public and keyless and showed no WAF even on a store fronted by Cloudflare — all seven TLS profiles returned byte-identical responses.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}