{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify App Store API — Apps, Pricing, Ratings & Reviews",
    "description": "Scrape the Shopify App Store as data: every app in a category, collection or developer page with rating, review count, pricing plans, launch date, developer and Built for Shopify badge, plus merchant reviews with developer replies. Honours robots.txt. No API key, no browser.",
    "version": "0.1",
    "x-build-id": "RMGH68DdT9F7Qs3An"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/insight.solutions~shopify-app-store-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-insight.solutions-shopify-app-store-api",
        "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/insight.solutions~shopify-app-store-api/runs": {
      "post": {
        "operationId": "runs-sync-insight.solutions-shopify-app-store-api",
        "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/insight.solutions~shopify-app-store-api/run-sync": {
      "post": {
        "operationId": "run-sync-insight.solutions-shopify-app-store-api",
        "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": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "What to read",
            "enum": [
              "category",
              "collection",
              "partner",
              "apps",
              "categories"
            ],
            "type": "string",
            "description": "`category`: the apps a category lists (from `categories`). `collection`: a collection such as `built-for-shopify` (from `collections`). `partner`: every app of a developer (from `partners`). `apps`: the apps you name (from `apps`). `categories`: the category tree, free — the store's navigation, or the subcategories of the slugs in `categories`. No search mode: robots.txt disallows the store's search to crawlers, so `keyword` filters listings instead.",
            "default": "category"
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Category slugs (`marketing-and-conversion-marketing-email-marketing`) or category URLs (`https://apps.shopify.com/categories/…`); tracking parameters and `?page=` are ignored. Run mode `categories` once to get every slug. Read in mode `category`, and in mode `categories` to list subcategories.",
            "items": {
              "type": "string"
            }
          },
          "collections": {
            "title": "Collections",
            "type": "array",
            "description": "Collection slugs (`built-for-shopify`) or URLs — `https://apps.shopify.com/collections/<slug>` or the `/app-groups/…` address it redirects to. Read in mode `collection`.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "partners": {
            "title": "Developers",
            "type": "array",
            "description": "Developer (partner) slugs (`klaviyo`) or URLs (`https://apps.shopify.com/partners/klaviyo`). Every app the developer lists is returned. Read in mode `partner`.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "apps": {
            "title": "Apps",
            "type": "array",
            "description": "App handles (`judgeme`) or app URLs (`https://apps.shopify.com/klaviyo-email-marketing`, its `/reviews` tab works too). Read in mode `apps`: each app's page is read and billed as a full app row — or, with `includeDetails` off and `includeReviews` on, only its reviews are read.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "keyword": {
            "title": "Keyword filter",
            "type": "string",
            "description": "Keep only apps whose name or one-line summary contains this phrase (case-insensitive). It filters the apps the listing pages return — it is not the store's search, which robots.txt disallows — so a filtered run reads the same listing pages and skips the app pages it does not need. Apps that do not match are not billed. Ignored in mode `apps`.",
            "default": ""
          },
          "includeDetails": {
            "title": "Read each app's page",
            "type": "boolean",
            "description": "On: one request per app for its full listing — description, highlights, every pricing plan with features and trial days, launch date, developer and website, support address, languages, integrations, categories, screenshots and the star-rating breakdown — billed as an `app` row. Off: only what the category or collection card shows (name, rating, review count, pricing summary, Built for Shopify badge), billed as the cheaper `app-listing` row, with no extra request per app.",
            "default": true
          },
          "includeReviews": {
            "title": "Include reviews",
            "type": "boolean",
            "description": "One extra row per merchant review (star rating, date, the reviewing store's name, country, time using the app, text, developer reply and its date), billed per review. Ten reviews per request.",
            "default": false
          },
          "maxReviewsPerApp": {
            "title": "Reviews per app",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "The most reviews to return for each app, in `reviewSort` order.",
            "default": 30
          },
          "reviewSort": {
            "title": "Review order",
            "enum": [
              "newest",
              "relevance"
            ],
            "type": "string",
            "description": "The two orders the store offers: `newest` (date, newest first) or `relevance` (the store's default, \"Most relevant\").",
            "default": "newest"
          },
          "reviewRatings": {
            "title": "Review star ratings",
            "type": "array",
            "description": "Only reviews with these star ratings, e.g. `[\"1\", \"2\"]` for complaints. The store filters (`ratings[]=`) and the Actor checks again. Empty = every rating.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 star",
                "2 stars",
                "3 stars",
                "4 stars",
                "5 stars"
              ]
            },
            "default": []
          },
          "maxAppsPerSource": {
            "title": "Apps per category, collection or developer",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "The most apps to take from each source, in the order the store lists them. A category landing page that shows fewer apps than this is followed by the category's full list when the store has one.",
            "default": 50
          },
          "maxAppsTotal": {
            "title": "Apps in the whole run",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "A ceiling across all sources. An app listed under two of your sources is returned, and billed, once.",
            "default": 500
          },
          "maxConcurrency": {
            "title": "Apps in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many app pages (and their review pages) are read at once. Each worker keeps its own proxy session; requests from one worker are spaced 300–600 ms apart.",
            "default": 3
          },
          "maxRunSecs": {
            "title": "Maximum run time (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "Whole-run wall-clock budget. When it runs out the Actor keeps every row it already returned and files a free `timeout` row saying what was not read.",
            "default": 240
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify datacenter proxy by default — the App Store serves its public pages to it. Switch to the RESIDENTIAL group if a run comes back with `blocked` rows.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}