{
  "openapi": "3.0.1",
  "info": {
    "title": "Shopify App Store Scraper - Keyword Ranks & Watchlist",
    "description": "Scrape the Shopify App Store: keyword and category ranks, app details (ratings, pricing tiers, Built for Shopify badge), and watchlist deltas for rating, reviews, price, and badge changes. Built for daily runs. No Partner login.",
    "version": "0.1",
    "x-build-id": "vgspWWSceSjVGOXAG"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/crawloop~shopify-app-store-rank-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-crawloop-shopify-app-store-rank-tracker",
        "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/crawloop~shopify-app-store-rank-tracker/runs": {
      "post": {
        "operationId": "runs-sync-crawloop-shopify-app-store-rank-tracker",
        "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/crawloop~shopify-app-store-rank-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-crawloop-shopify-app-store-rank-tracker",
        "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": "Mode",
            "enum": [
              "app_details",
              "keyword_ranks",
              "category_ranks",
              "watchlist",
              "search",
              "canary"
            ],
            "type": "string",
            "description": "What to scrape from the public Shopify App Store.",
            "default": "keyword_ranks"
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "App, category, or search URLs. Handles and category paths are parsed automatically.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "appHandles": {
            "title": "App handles",
            "type": "array",
            "description": "App Store handles to track (slug after apps.shopify.com/), e.g. klaviyo-email-marketing, judgeme.",
            "items": {
              "type": "string"
            }
          },
          "searchTerm": {
            "title": "Search term",
            "type": "string",
            "description": "Single keyword for search / keyword_ranks.",
            "default": ""
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Keywords for search or keyword_ranks. Merged with Search term.",
            "items": {
              "type": "string"
            }
          },
          "categoryUrls": {
            "title": "Category URLs / paths",
            "type": "array",
            "description": "Category paths or full URLs, e.g. marketing-and-conversion or https://apps.shopify.com/categories/marketing-and-conversion",
            "items": {
              "type": "string"
            }
          },
          "maxSearchPages": {
            "title": "Max search pages",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Pages to crawl per keyword (≈24–28 apps/page). Used by search and keyword_ranks.",
            "default": 3
          },
          "includeAds": {
            "title": "Include ads in ranks",
            "type": "boolean",
            "description": "If true, sponsored search_ad cards count toward SERP position. Default false = organic-only ranks.",
            "default": false
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "Parallel HTTP workers (1–16).",
            "default": 4
          },
          "rankHistoryLimit": {
            "title": "Rank history limit",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "KV snapshots kept per app×keyword/category.",
            "default": 30
          },
          "emitRankChanges": {
            "title": "Emit rank change events",
            "type": "boolean",
            "description": "In keyword_ranks / category_ranks, also push RANK_CHANGE monitor events when position moves.",
            "default": true
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum dataset rows to push (0 = unlimited).",
            "default": 100
          },
          "maxRequestsPerSecond": {
            "title": "Max requests per second",
            "minimum": 0.5,
            "maximum": 20,
            "type": "number",
            "description": "Client-side rate limit.",
            "default": 4
          },
          "monitorStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named Apify key-value store for rank history and watchlist fingerprints.",
            "default": "shopify-app-store-rank-tracker-state"
          },
          "monitorBaselineOnly": {
            "title": "Baseline only (first run)",
            "type": "boolean",
            "description": "Seed KV state without emitting change events (watchlist) or optionally skip dataset pushes for ranks.",
            "default": false
          },
          "resetMonitorState": {
            "title": "Reset state",
            "type": "boolean",
            "description": "Clear fingerprints / rank history in the state store before this run.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional Apify Proxy. Usually not required for public App Store pages.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}