{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify App Store Scraper",
    "description": "Extract apps and reviews from the Shopify App Store: name, developer, rating, review count, pricing plans, free trial, categories, Built for Shopify badge, launch date, languages, integrations. Browse by category, developer or app URL; optionally every review with text, date and developer reply.",
    "version": "0.1",
    "x-build-id": "BayzImgjxwBOkb7mc"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/davidts~shopify-app-store-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-davidts-shopify-app-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/davidts~shopify-app-store-scraper/runs": {
      "post": {
        "operationId": "runs-sync-davidts-shopify-app-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/davidts~shopify-app-store-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-davidts-shopify-app-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": {
          "categories": {
            "title": "Categories",
            "uniqueItems": true,
            "type": "array",
            "description": "Category slugs from apps.shopify.com/categories/<slug>, for example `marketing-and-conversion`, `store-design`, `orders-and-shipping`, `selling-products`, `finding-products`, `sales-channels`, `store-management`, or a sub-category such as `marketing-and-conversion-marketing-email-marketing` or `store-design-storefronts-page-builder`. A top-level category is followed into all of its sub-categories; a sub-category is read completely through its \"View all apps\" listing. The HTML sitemap at apps.shopify.com/sitemap lists every slug.",
            "items": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$"
            }
          },
          "appUrls": {
            "title": "App URLs or handles",
            "uniqueItems": true,
            "type": "array",
            "description": "Individual apps to scrape: the Store URL (`https://apps.shopify.com/klaviyo-email-marketing`) or just the handle (`klaviyo-email-marketing`). A reviews URL (`.../klaviyo-email-marketing/reviews`) also works and switches reviews on for that app. Use this to track specific competitor apps.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Any apps.shopify.com page to start from: category pages (`/categories/<slug>` or `/categories/<slug>/all?page=2`), developer pages (`/partners/<name>`), collection pages (`/collections/<name>`), app pages, or `https://apps.shopify.com/sitemap` to crawl every category. Search result URLs are refused (robots.txt).",
            "items": {
              "type": "object",
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL",
                  "description": "A page on apps.shopify.com"
                }
              },
              "required": [
                "url"
              ]
            }
          },
          "maxApps": {
            "title": "Maximum number of apps",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many apps have been collected (across all categories, pages and app URLs). `0` means no limit: a whole top-level category can be a few thousand apps. For a first test, 10-20 is plenty.",
            "default": 200
          },
          "includeReviews": {
            "title": "Include reviews",
            "type": "boolean",
            "description": "Also collect the reviews of every app (one dataset item per review with rating, date, text, country, time using the app and the developer's reply). Reviews are priced like apps, so 50 reviews for 200 apps are 10,000 extra results. Turn it on for review mining or sentiment analysis; leave it off for app listings, pricing and ratings only.",
            "default": false
          },
          "maxReviewsPerApp": {
            "title": "Maximum reviews per app",
            "minimum": 0,
            "type": "integer",
            "description": "How many reviews to collect per app when `includeReviews` is on (10 reviews per page on the Store). `0` means all reviews, which can be tens of thousands for popular apps.",
            "default": 50
          },
          "sortBy": {
            "title": "Review order",
            "enum": [
              "newest",
              "relevance"
            ],
            "type": "string",
            "description": "Order in which the Store lists the reviews, which decides which reviews come first when `maxReviewsPerApp` cuts them off. `newest` includes many star-only ratings without text; `relevance` (the Store's default) puts written reviews first. Apps themselves keep the Store's own listing order (there is no sort option for apps on the Store).",
            "default": "newest"
          },
          "includeReviewerStoreName": {
            "title": "Include the reviewing store's name",
            "type": "boolean",
            "description": "Add `reviewerStoreName` (the name of the Shopify store that wrote the review) to every review item. Off by default: it is a business name, but you should only collect it when your use case needs it.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxies used for the requests to apps.shopify.com. Apify datacenter proxies (the default) are enough for app pages and reviews. The complete category listings (`/categories/<slug>/all`) are the most protected pages of the Store: if the log reports HTTP 429 for them, switch to residential proxies.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}