{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Scraper",
    "description": "Shopify store scraper, Shopify store finder: find Shopify stores by niche, search Shopify stores for a Shopify stores list with public emails, find Shopify store theme; export Shopify store data. Shopify catalog scraper, Shopify product data scraper (Shopify store catalog, Shopify products JSON).",
    "version": "0.1",
    "x-build-id": "ej0rqPRxTCPYMSFDL"
  },
  "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": {
          "nicheKeywords": {
            "title": "Find stores by niche (keywords)",
            "type": "array",
            "description": "Find-stores mode: products or niches to find Shopify stores for, e.g. <code>coffee beans</code>, <code>yoga mats</code>, <code>cork yoga mat</code>. Each keyword is one search on Shop by Shopify (shop.app) and reads one results page (up to about 20 stores), so add several phrasings of the same niche for more stores. Every store is checked on its own /meta.json and only confirmed Shopify stores are delivered and charged. Leave this untouched and type Store URLs below to scrape a catalog instead.",
            "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
          },
          "storeUrls": {
            "title": "Shopify store URLs",
            "type": "array",
            "description": "Catalog mode: Shopify store URLs whose public /products.json feed is exported; a bare domain works too. An API call or saved task without nicheKeywords always runs the catalog export. In this form, leave the niche keywords untouched and type URLs here: changed keywords find stores and ignore these URLs; to export the sample kith.com itself, empty the niche keywords. 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
          },
          "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; in find-stores mode it pins the Shop by Shopify market when Apify Proxy has no country of its own.",
            "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
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}