{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Scraper",
    "description": "Shopify products scraper and Shopify store scraper: export any store's products, prices, SKUs, stock and theme. Shopify catalog scraper, Shopify product data scraper, Shopify store catalog, Shopify products JSON. Shopify price monitor, Shopify price tracker, Shopify stock monitor: get only changes.",
    "version": "0.1",
    "x-build-id": "fdStU7dhlCmmj8G9g"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/flash_scraper~shopify-store-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-flash_scraper-shopify-store-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/flash_scraper~shopify-store-scraper/runs": {
      "post": {
        "operationId": "runs-sync-flash_scraper-shopify-store-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/flash_scraper~shopify-store-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-flash_scraper-shopify-store-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": {
          "storeUrls": {
            "title": "Shopify store URLs",
            "type": "array",
            "description": "Catalog mode: the Shopify stores to export. Each store's public /products.json catalog feed is exported; a bare domain works too. Keep nicheKeywords empty: typed niche keywords start a store search instead and these URLs are ignored. A store that keeps refusing (HTTP 429, 403 or 430) is skipped; rows already read from it stay delivered and billed.",
            "default": [
              "https://www.kith.com"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxProducts": {
            "title": "Max products per store",
            "minimum": 0,
            "type": "integer",
            "description": "Catalog mode: maximum products per store. **0 = the store's entire catalog**, up to the 25,000 products Shopify's public feed serves per store - a large shop takes about 100 requests and often triggers HTTP 429 throttling - set a limit for a fast sample, raise it or use 0 once you know the store tolerates it.",
            "default": 50
          },
          "oneRowPerVariant": {
            "title": "One row per variant",
            "type": "boolean",
            "description": "Catalog mode: ON = emit a row for every variant (best for price/SKU monitoring). OFF = one row per product with a price range.",
            "default": false
          },
          "onlyChangedProducts": {
            "title": "Only changed products (price & stock monitor)",
            "type": "boolean",
            "description": "Catalog mode: a price & stock monitor - put it in a schedule. The first run of a store is its baseline: the normal catalog, billed as usual. Later runs deliver only products whose price, compare-at price or availability changed, plus new products, each tagged with change_types. Unchanged products are not delivered and not billed. The memory is kept per store and market in your Apify account. Set Max products per store to 0 to watch the whole catalog.",
            "default": false
          },
          "includeStoreProfile": {
            "title": "Include store profile record",
            "type": "boolean",
            "description": "Catalog mode: adds one extra row per store (marked record_type: store) with the store's name, city, province, country, base currency, myshopify domain, TOTAL catalogue size, collection count, how many countries it ships to, accepted card brands, Shop Pay availability, theme name and social handles. This is store intelligence for qualifying a merchant - product scrapers do not return it. (Find-stores rows always carry these fields.)",
            "default": true
          },
          "includeCollections": {
            "title": "Include the store's collections",
            "type": "boolean",
            "description": "Catalog mode: adds the store's published collections (title, handle, product count, URL) to the store profile row - the merchant's own merchandising structure.",
            "default": false
          },
          "market": {
            "title": "Market / currency to price in",
            "type": "string",
            "description": "Both modes: two-letter market code, e.g. US, GB, DE. Catalog prices are localised by Shopify to the requesting IP (the same variant read 1827.00 from a Moroccan exit node and 190.00 (USD) with this pinned), so this pins them.",
            "default": "US"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Both modes: Shopify blocks Apify's bare run IP, so this Actor routes requests through Apify Proxy by default. The standard datacenter group is enough - verified working - and costs far less than RESIDENTIAL. Leave this on unless you have your own proxy.",
            "default": {
              "useApifyProxy": true
            }
          },
          "nicheKeywords": {
            "title": "Find stores by niche (keywords)",
            "type": "array",
            "description": "Find-stores mode: words to find Shopify stores by, e.g. coffee or candle (up to 20). A store is found only when its web address contains the word - coffee finds brandcoffee.com, never a roaster called bluecopper.com - and only among popular sites (the CrUX top 1 million). A multi-word keyword searches its longest word; a word of 4 letters or fewer (tea, art) must also be in the store's name or description. Leave this empty for a catalog run with the Store URLs above.",
            "items": {
              "type": "string"
            }
          },
          "maxStores": {
            "title": "Max stores",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Find-stores mode: stop after this many confirmed stores. Stores dropped by the filters below do not count.",
            "default": 50
          },
          "includeContacts": {
            "title": "Include contacts (public email)",
            "type": "boolean",
            "description": "Find-stores mode: return the public email addresses found on each store's homepage and /pages/contact (emails, primary_email, contact_page). Off = no email columns; the store profile, theme and social handles are still returned.",
            "default": true
          },
          "storeCountry": {
            "title": "Store country (ISO-2 codes)",
            "type": "array",
            "description": "Find-stores mode filter: keep only stores whose Shopify country is one of these two-letter codes, e.g. <code>US</code>, <code>CA</code>, <code>GB</code>. The country is the one the store declares in its own /meta.json. A store that declares no country is dropped when this filter is set. Dropped stores are not delivered and not charged. Empty = every country.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minProducts": {
            "title": "Minimum catalogue size",
            "minimum": 0,
            "type": "integer",
            "description": "Find-stores mode filter: keep only stores with at least this many published products, read from the store's own catalogue count (published_products_count in its /meta.json). A store that reports no count is treated as 0. Dropped stores are not delivered and not charged. 0 = no minimum.",
            "default": 0
          },
          "requireEmail": {
            "title": "Only stores with a public email",
            "type": "boolean",
            "description": "Find-stores mode filter: keep only stores where a public email address was found on the homepage or contact page. Needs <b>Include contacts</b> on - with contacts off this filter is ignored and the run says so. Dropped stores are not delivered and not charged.",
            "default": 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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}