{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify Products Scraper: Media, Currency & Related Products",
    "description": "Shopify Products Scraper — Scrape Shopify products with titles, prices, currency, images, videos, product media, variants, descriptions, and related products. Extract structured ecommerce data for product research, competitor analysis, catalog monitoring, and market insights.",
    "version": "0.1",
    "x-build-id": "oMBHKEmTrhXs235T6"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapier~shopify-products-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapier-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/scrapier~shopify-products-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapier-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/scrapier~shopify-products-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapier-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": {
          "targets": {
            "title": "📥 Store or product URLs",
            "type": "array",
            "description": "One or more Shopify storefront URLs. A store URL (https://rothys.com) scrapes its catalogue; a single product URL (https://rothys.com/products/some-handle) scrapes just that product. Example: [\"https://rothys.com\", \"https://www.deathwishcoffee.com\"]. Default is one demo store.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "🔗 Store URLs (legacy field)",
            "type": "array",
            "description": "Kept so input files written for the original actor keep working. Anything listed here is merged with the field above. Leave empty if you filled in the field above.",
            "items": {
              "type": "string"
            }
          },
          "resolveStoreCurrency": {
            "title": "💱 Confirm the store's currency",
            "type": "boolean",
            "description": "Reads the storefront's own declared currency and reports it as storeCurrency, then compares it to the currency the prices were actually quoted in. Sets currencyMatchesStore so a storefront that quotes a different currency than it declares is visible instead of silent. Default is true.",
            "default": true
          },
          "includePriceRange": {
            "title": "📊 Price range across variants",
            "type": "boolean",
            "description": "Adds priceMin, priceMax, priceVaries, compareAtPriceMax, compareAtPriceVaries, discountPercent and isOnSale. The range is built from purchasable variants only, so sold-out and placeholder variants cannot drag the minimum to zero. Default is true.",
            "default": true
          },
          "verifyPriceUnits": {
            "title": "✅ Verify the price unit per product",
            "type": "boolean",
            "description": "Independently recomputes every variant price from a second storefront source and checks the two agree exactly, then reports the result as priceUnitVerified plus priceUnitCheckedVariants. Guards against a hundred-fold unit error that would otherwise look like ordinary data. Default is true.",
            "default": true
          },
          "treatZeroCompareAtAsNull": {
            "title": "∅ Treat an empty or zero 'compare at' as no value",
            "type": "boolean",
            "description": "Shopify themes often store a strike-through price as an empty string or 0 when there is no sale. With this on, those become null so no row implies a 100% discount. Turn it off to receive the raw value exactly as published. Default is true.",
            "default": true
          },
          "includeMediaInventory": {
            "title": "🖼️ Full typed media inventory",
            "type": "boolean",
            "description": "Adds mediaCount and a media array holding each asset's position, type, URL, alt text, dimensions and (for video) duration and preview frame, plus imageCount, videoCount, hasVideo, has3dModel and featuredImageUrl. URLs and metadata only - no files are ever fetched, stored or bundled. Default is true.",
            "default": true
          },
          "mediaTypes": {
            "title": "🎬 Media types to keep",
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only these asset types in the media array and in the per-type counts. Example: choose Image + Video to drop 3D models. Default is all four types.",
            "items": {
              "type": "string",
              "enum": [
                "image",
                "video",
                "external_video",
                "model"
              ],
              "enumTitles": [
                "Image",
                "Video (hosted)",
                "External video (YouTube / Vimeo)",
                "3D model"
              ]
            },
            "default": [
              "image",
              "video",
              "external_video",
              "model"
            ]
          },
          "includeRelatedProducts": {
            "title": "🔀 Related-product graph",
            "type": "boolean",
            "description": "Collects the products the storefront itself recommends alongside each product and emits them as separate child rows (type = related, isChild = true) carrying parentProductId, relatedProductId, relatedTitle, relatedPrice, relatedAvailable and rank. Also mirrored to a dedicated dataset for this run. Default is true.",
            "default": true
          },
          "maxRelatedPerProduct": {
            "title": "🔢 Max related products per product",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "How many related products to keep for each product, ranked as the storefront ranks them. Example: 5 on a 30-product run yields up to 150 related rows. Set 0 to turn the graph off. Kept low by default because it costs one extra lookup per product. Default is 5.",
            "default": 5
          },
          "maxProducts": {
            "title": "📦 Max products per store",
            "minimum": 0,
            "type": "integer",
            "description": "Upper bound on how many products are returned for each store URL. Example: maxProducts=30 with 3 stores returns up to 90 product rows. Set 0 for the whole catalogue. Default is 30."
          },
          "maxItems": {
            "title": "🔢 Max products per store (legacy field)",
            "minimum": 0,
            "type": "integer",
            "description": "Kept so input files written for the original actor keep working. Used only when the field above is left empty."
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy configuration",
            "type": "object",
            "description": "Choose the connection route used to reach the storefronts. Leave off to connect directly. Large catalogues and stores that limit how fast they answer are more reliable with a proxy selected."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}