{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Product Scraper: Failed Runs Cost Nothing",
    "description": "Export every product and variant from a list of Shopify stores: SKU, price, compare-at price, currency and stock. A failed or empty run costs nothing, and a run fails if a product the store lists publicly is missing. A free dry run estimates the cost first, and the run stops at a spend cap you set.",
    "version": "0.1",
    "x-build-id": "hk66RPPUAM6wdC1bw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/montyburrows~shopify-products/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-montyburrows-shopify-products",
        "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/montyburrows~shopify-products/runs": {
      "post": {
        "operationId": "runs-sync-montyburrows-shopify-products",
        "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/montyburrows~shopify-products/run-sync": {
      "post": {
        "operationId": "run-sync-montyburrows-shopify-products",
        "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": [
          "storeUrls"
        ],
        "properties": {
          "storeUrls": {
            "title": "Store domains",
            "minItems": 1,
            "maxItems": 250,
            "type": "array",
            "description": "The stores to read, one per line. A bare domain like beardbrand.com, or any URL on the store. Redirects are followed, so the apex and the www form of the same store are one store. Up to 250 per run.",
            "items": {
              "type": "string"
            }
          },
          "collectionHandles": {
            "title": "Collections (optional)",
            "maxItems": 50,
            "type": "array",
            "description": "Read only these collections instead of the whole catalogue, on every store. The handle is the last part of a collection URL: store.com/collections/sale gives you \"sale\". A collection a given store does not have is reported for that store and costs you nothing. Leave empty for the whole catalogue.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "availableOnly": {
            "title": "In-stock variants only",
            "type": "boolean",
            "description": "Emit only variants the store says are in stock. Off by default, because a variant that has gone out of stock since your last run is usually the thing you wanted to know about. A product with nothing in stock is left out, and it still counts as read, so it never fails the sitemap cross-check.",
            "default": false
          },
          "includeBodyHtml": {
            "title": "Include the product description",
            "type": "boolean",
            "description": "Adds the full description HTML to every row. Off by default: it is the bulk of the response, and it repeats on every variant of a product.",
            "default": false
          },
          "crossCheckSitemap": {
            "title": "Cross-check the store's own sitemap",
            "type": "boolean",
            "description": "Reads each store's product sitemap and marks every row with whether the merchant lists that product publicly. On by default. It is how you tell a real product from the protection plans, cashback line items and bundle-builder placeholders that apps install into a merchant's catalogue: measured across six stores, the catalogue endpoint returned up to ten of those per store, and none of them appeared in the merchant's own sitemap. It also fails the run if a product the merchant does list publicly is ever missing from the feed. On a store that sells in several countries it reads the primary market's sitemap, which is the catalogue the rows come from.",
            "default": true
          },
          "dryRun": {
            "title": "Dry run (free cost estimate)",
            "type": "boolean",
            "description": "Count what you would get and what it would cost, then stop. Nothing is written to the dataset and you are charged nothing. Dry runs read at most 25 of your stores and extrapolate the rest, and the report says which. For 25 stores or fewer the count is exact, because pagination here is a plain integer and there is nothing to estimate.",
            "default": false
          },
          "maxResults": {
            "title": "Maximum results",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "The most variant rows this run may produce. The run stops as soon as it is reached. This is a hard cap, not a target. A row is a variant, not a product: the stores measured carried a median of 2.9 variants each.",
            "default": 20000
          },
          "maxCostUsd": {
            "title": "Maximum spend (USD)",
            "minimum": 0.001,
            "type": "number",
            "description": "The most this run may cost you, in US dollars. The run stops before exceeding it. Leave empty to be limited only by Maximum results."
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy configuration. The default (datacentre) is the cheapest option and is all this source needs. Stores that refuse us refuse on the first request, and a different exit IP does not change that.",
            "default": {
              "useApifyProxy": true
            }
          },
          "proxyTier": {
            "title": "Proxy pool",
            "enum": [
              "none",
              "datacenter",
              "residential"
            ],
            "type": "string",
            "description": "Datacentre is cheap and fast. Residential costs considerably more and there is no evidence this source needs it.",
            "default": "datacenter"
          },
          "maxConcurrency": {
            "title": "Maximum concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many requests to run at once against a single host. Stores are read one at a time regardless, and each store is paced to one request per second.",
            "default": 4
          },
          "maxRequestRetries": {
            "title": "Maximum retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "How many times to retry a failed request before giving up on that store.",
            "default": 4
          },
          "requestTimeoutSecs": {
            "title": "Request timeout",
            "minimum": 1,
            "maximum": 300,
            "type": "integer",
            "description": "How long a single request may take before it is retried. A page is up to 250 products with their descriptions, so leave room.",
            "default": 60
          },
          "debug": {
            "title": "Debug logging",
            "type": "boolean",
            "description": "Log every request and retry. Useful when opening a support ticket.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}