{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Product Scraper — Variants & Prices",
    "description": "Extract Shopify products, variants, prices, inventory signals, images, descriptions, and collections into structured ecommerce data.",
    "version": "1.0",
    "x-build-id": "ugYamVeTxnC2fpl5k"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/muhammadafzal~shopify-product-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-muhammadafzal-shopify-product-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/muhammadafzal~shopify-product-scraper/runs": {
      "post": {
        "operationId": "runs-sync-muhammadafzal-shopify-product-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/muhammadafzal~shopify-product-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-muhammadafzal-shopify-product-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": "Mode",
            "enum": [
              "url",
              "discovery"
            ],
            "type": "string",
            "description": "Choose URL mode when the user provides Shopify store URLs (https://www.allbirds.com). Choose discovery mode to find Shopify stores by category first. Default is url. Do NOT use discovery mode for scraping a known store.",
            "default": "url"
          },
          "storeUrls": {
            "title": "Shopify Store URLs",
            "type": "array",
            "description": "Use this field when the user provides one or more Shopify storefronts. Accepts store homepages such as https://www.allbirds.com; product paths are normalized to the store origin. Default scrapes Allbirds so health checks produce output. NOT used in discovery mode.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "Store URL",
                  "description": "A Shopify store homepage or product URL, for example https://www.allbirds.com. The actor normalizes product paths to the store origin before scraping."
                }
              }
            },
            "default": [
              {
                "url": "https://www.allbirds.com"
              }
            ]
          },
          "category": {
            "title": "Discovery Category",
            "enum": [
              "",
              "fashion",
              "fashion/shoes",
              "fashion/jewellery",
              "fashion/bags",
              "fashion/lingerie",
              "fashion/outerwear",
              "fashion/swimwear",
              "fashion/activewear",
              "fashion/kids",
              "beauty",
              "skincare",
              "skincare/serum",
              "skincare/mask",
              "skincare/cleanser",
              "skincare/sunscreen",
              "skincare/acne",
              "skincare/toner",
              "skincare/exfoliant",
              "haircare",
              "haircare/shampoo",
              "haircare/conditioner",
              "haircare/styling",
              "haircare/tools",
              "food",
              "food/snack",
              "food/candy",
              "food/bakery",
              "food/meat",
              "food/seafood",
              "food/vegan",
              "food/organic",
              "food/glutenfree",
              "food/coffee",
              "food/tea",
              "food/alcohol",
              "electronics",
              "electronics/phone",
              "electronics/computer",
              "electronics/camera",
              "electronics/audio",
              "electronics/wearable",
              "home",
              "home/furniture",
              "home/lighting",
              "home/decor",
              "home/storage",
              "kitchen",
              "kitchen/appliance",
              "kitchen/cookware",
              "kitchen/utensil",
              "kitchen/storage",
              "kitchen/tableware",
              "kitchen/drinkware",
              "sports",
              "sports/equipment",
              "sports/clothing",
              "pets",
              "pets/food",
              "pets/accessory",
              "pets/health",
              "baby",
              "baby/clothing",
              "baby/gear",
              "baby/feeding",
              "baby/toys",
              "bedding",
              "bathroom",
              "bath-body",
              "dental",
              "eyewear",
              "watches",
              "bags",
              "accessories",
              "gifts",
              "flowers",
              "party",
              "books",
              "music",
              "art",
              "crafts",
              "outdoors",
              "automotive",
              "tools",
              "office",
              "safety",
              "cleaning",
              "energy",
              "alcohol"
            ],
            "type": "string",
            "description": "Use this ONLY in discovery mode to filter Shopify stores by niche. Examples: fashion, skincare, food/coffee, electronics, pets. Leave empty to discover across all categories. This is NOT a product category filter inside one store.",
            "default": ""
          },
          "maxStores": {
            "title": "Max Stores to Discover",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum stores to collect from the discovery directory before scraping products. Use a small number for tests (10). Default 100, max 5000. Only used in discovery mode.",
            "default": 100
          },
          "maxPages": {
            "title": "Max Discovery Pages",
            "minimum": 1,
            "maximum": 220,
            "type": "integer",
            "description": "Maximum discovery directory pages to inspect. Each page may contain many stores. Default 10, max 220. Only used in discovery mode, NOT for Shopify product pagination.",
            "default": 10
          },
          "maxProducts": {
            "title": "Max Products per Store",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum products to extract from each Shopify store. Use 10 for quick tests, higher values for full catalog research. Default 100, max 10000. Applies per store, not across all stores.",
            "default": 100
          },
          "includeReviews": {
            "title": "Include Review Summaries & Sales Estimates",
            "type": "boolean",
            "description": "When enabled, fetches each product page and reads JSON-LD aggregate ratings. Adds rating, review_count, review_source, and estimated_monthly_sales fields to product records. Default true. Disable for faster catalog-only runs.",
            "default": true
          },
          "maxReviewsPerProduct": {
            "title": "Max Reviews per Product (individual)",
            "minimum": 0,
            "maximum": 500,
            "type": "integer",
            "description": "Maximum individual customer reviews to extract per product (separate review records). Set to 0 to skip individual review extraction. Default 0 (off). Set 10-50 for sentiment analysis. Reviews are detected from Judge.me, Yotpo, Loox, Stamped, Okendo, and JSON-LD.",
            "default": 0
          },
          "scrapeCollections": {
            "title": "Scrape Collections",
            "type": "boolean",
            "description": "When enabled, extracts all store collections (categories) from /collections.json. Each collection is returned as a separate record with title, handle, description, product count, and image. Default false.",
            "default": false
          },
          "maxCollections": {
            "title": "Max Collections per Store",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum collections to extract per store when scrapeCollections is enabled. Default 250, max 5000. Large stores may have thousands of collections.",
            "default": 250
          },
          "scrapeContactInfo": {
            "title": "Scrape Merchant Contact Info",
            "type": "boolean",
            "description": "When enabled, extracts merchant email, phone, address, and social media links (Facebook, Instagram, Twitter/X, TikTok, YouTube, Pinterest) from the store homepage. Returns one contact record per store. High value for B2B lead generation. Default false.",
            "default": false
          },
          "scrapeTechStack": {
            "title": "Detect Installed Apps & Tech Stack",
            "type": "boolean",
            "description": "When enabled, detects installed Shopify apps (Klaviyo, Yotpo, Judge.me, ReCharge, Smile.io, Gorgias, etc.), theme metadata, and store intelligence from the homepage. Returns one storeIntel record per store. Default false.",
            "default": false
          },
          "reviewConversionRate": {
            "title": "Review Conversion Rate",
            "minimum": 0.001,
            "maximum": 1,
            "type": "number",
            "description": "Estimated share of buyers who leave reviews, used to convert review counts into conservative monthly sales estimates. Example: 0.02 means 2% of buyers review. Default 0.02. This is an estimate, NOT verified revenue data.",
            "default": 0.02
          },
          "requestDelayMs": {
            "title": "Request Delay Milliseconds",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Delay between successful HTTP requests. Use 0 for fastest runs or 500-2000 for gentler scraping on larger catalogs. Default 500, max 10000. This is NOT a timeout setting.",
            "default": 500
          },
          "maxRequestRetries": {
            "title": "Max Request Retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Retry attempts for temporary HTTP, proxy, or network failures. Default 3, max 10. A 404 product catalog still produces no products rather than retrying forever. Does NOT bypass private stores or password walls.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy Settings",
            "type": "object",
            "description": "Apify proxy settings for large catalogs or protected storefronts. The default uses Apify Proxy for better reliability. Use custom proxy URLs only when you need a dedicated premium proxy. Optional for small public Shopify stores.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}