{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Workspace Marketplace Scraper: Apps & Reviews",
    "description": "Scrape & monitor Google Workspace Marketplace apps & developers (Gmail, Docs, Sheets add-ons): exact installs, ratings, OAuth scopes, reviews with complaint insights, market reports. $2/1,000 apps.",
    "version": "1.0",
    "x-build-id": "hXNEmbsyMi5hCCjZ3"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/signalscope-data~workspace-marketplace-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-signalscope-data-workspace-marketplace-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/signalscope-data~workspace-marketplace-tracker/runs": {
      "post": {
        "operationId": "runs-sync-signalscope-data-workspace-marketplace-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/signalscope-data~workspace-marketplace-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-signalscope-data-workspace-marketplace-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",
        "properties": {
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Keywords to search on the marketplace, e.g. \"crm\", \"email tracking\", \"mail merge\", \"ai\". Each term is a separate ranked list (the marketplace shows up to 100 apps per search).",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Marketplace categories and curated lists to scrape (up to 100 apps each, in marketplace order). Leave search terms, categories and app URLs empty to get the Popular apps list.",
            "items": {
              "type": "string",
              "enum": [
                "popular-apps",
                "top-rated",
                "recommended",
                "apps-to-discover",
                "business-essentials",
                "enterprise-apps",
                "work-from-everywhere",
                "google-apps",
                "business-tools",
                "business-tools/accounting-and-finance",
                "business-tools/administration-and-management",
                "business-tools/erp-and-logistics",
                "business-tools/hr-and-legal",
                "business-tools/marketing-and-analytics",
                "business-tools/sales-and-crm",
                "productivity",
                "productivity/creative-tools",
                "productivity/office-applications",
                "productivity/task-management",
                "productivity/web-development",
                "education",
                "education/academic-resources",
                "education/teacher-and-admin-tools",
                "communication",
                "utilities",
                "integrations"
              ],
              "enumTitles": [
                "Popular apps",
                "Top rated",
                "Recommended",
                "Apps to discover",
                "Business essentials",
                "Enterprise apps",
                "Work from everywhere",
                "Google apps",
                "Business tools",
                "Business tools › Accounting & finance",
                "Business tools › Administration & management",
                "Business tools › Erp & logistics",
                "Business tools › Hr & legal",
                "Business tools › Marketing & analytics",
                "Business tools › Sales & crm",
                "Productivity",
                "Productivity › Creative tools",
                "Productivity › Office applications",
                "Productivity › Task management",
                "Productivity › Web development",
                "Education",
                "Education › Academic resources",
                "Education › Teacher & admin tools",
                "Communication",
                "Utilities",
                "Integrations"
              ]
            }
          },
          "appUrls": {
            "title": "App URLs or IDs (watchlist)",
            "type": "array",
            "description": "Specific apps to track, e.g. \"https://workspace.google.com/marketplace/app/insightly_crm/340379804296\" or just the numeric id \"340379804296\". Useful to monitor your own and competitors' listings.",
            "items": {
              "type": "string"
            }
          },
          "maxResultsPerQuery": {
            "title": "Max results per search / category",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Max apps per search term or category (the marketplace itself shows at most 100).",
            "default": 100
          },
          "worksWith": {
            "title": "Works with (filter)",
            "type": "array",
            "description": "Keep only apps that integrate with at least one of these Google apps, e.g. only Gmail add-ons or only Sheets add-ons.",
            "items": {
              "type": "string",
              "enum": [
                "gmail",
                "docs",
                "sheets",
                "slides",
                "forms",
                "drive",
                "calendar",
                "chat",
                "meet",
                "classroom",
                "web-app"
              ],
              "enumTitles": [
                "Gmail",
                "Google Docs",
                "Google Sheets",
                "Google Slides",
                "Google Forms",
                "Google Drive",
                "Google Calendar",
                "Google Chat",
                "Google Meet",
                "Google Classroom",
                "Standalone web app (Workspace sign-in)"
              ]
            }
          },
          "pricing": {
            "title": "Pricing (filter)",
            "type": "array",
            "description": "Keep only apps with one of these pricing models. Apps that don't state pricing are excluded when this filter is set.",
            "items": {
              "type": "string",
              "enum": [
                "free",
                "freemium",
                "free-trial",
                "paid"
              ],
              "enumTitles": [
                "Free",
                "Free with paid features",
                "Free trial",
                "Paid"
              ]
            }
          },
          "developers": {
            "title": "Developers (filter)",
            "type": "array",
            "description": "Keep only apps whose developer name or website contains one of these, e.g. \"zoho\", \"hubspot.com\".",
            "items": {
              "type": "string"
            }
          },
          "minInstalls": {
            "title": "Min installs",
            "minimum": 0,
            "type": "integer",
            "description": "Skip apps with fewer installs than this.",
            "default": 0
          },
          "minRating": {
            "title": "Min rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Skip apps rated below this (0-5).",
            "default": 0
          },
          "minReviews": {
            "title": "Min reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Skip apps with fewer reviews than this.",
            "default": 0
          },
          "includeDetails": {
            "title": "Include OAuth permissions & full description",
            "type": "boolean",
            "description": "Open each app page to add the OAuth scopes the app requests (oauthScopes, sensitiveAccess flags such as gmailFullAccess or driveFullAccess) and the full description. One extra request per app, charged as an extra app-details event.",
            "default": false
          },
          "outputLevel": {
            "title": "Output level",
            "enum": [
              "apps",
              "developers"
            ],
            "type": "string",
            "description": "\"developers\" groups the matched apps by developer and outputs one row per developer company with its whole app portfolio found on the marketplace (not just the matched apps): app count, total installs (exact), total reviews, weighted rating, top app, works-with products, pricing models, latest listing update, website + domain, EU trader status. Apps listed under several developer names or websites of the same company are merged. Monitor modes report new developers, new/removed apps, install and review growth and rating changes. Charged per developer row. No emails.",
            "default": "apps"
          },
          "includeReviews": {
            "title": "Include user reviews",
            "type": "boolean",
            "description": "Also output the user reviews of every matched app as separate rows (recordType \"review\"): star rating, review text, date and the developer's reply with its date. Reviewer names are not collected. In \"new\" / \"changed\" modes only reviews posted since the last run are returned.",
            "default": false
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Stop after this many reviews per app (the marketplace serves 10 per page).",
            "default": 50
          },
          "reviewSort": {
            "title": "Review order",
            "enum": [
              "recent",
              "helpful"
            ],
            "type": "string",
            "description": "Same two sort options as the Reviews tab on the marketplace.",
            "default": "recent"
          },
          "reviewLanguage": {
            "title": "Review language",
            "type": "string",
            "description": "Language code of the reviews to get, e.g. \"en\", \"de\", \"es\", \"fr\", \"pt-BR\", \"ja\". The marketplace shows reviews per language, like the Language selector on the Reviews tab.",
            "default": "en"
          },
          "maxReviewRating": {
            "title": "Max review stars",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Only output reviews with at most this many stars, e.g. 2 = complaints only (1-2 stars). 5 = all reviews.",
            "default": 5
          },
          "reviewsSince": {
            "title": "Reviews since",
            "type": "string",
            "description": "Only reviews posted after this date (\"2026-09-01\") or within this period (\"30 days\", \"2 weeks\", \"6 months\"). Empty = no date limit."
          },
          "includeReviewInsights": {
            "title": "Review insights & competitor comparison",
            "type": "boolean",
            "description": "Analyse the reviews of every matched app (the newest 'Max reviews per app', in 'Review language') and output one recordType \"review-insights\" row per app: rating distribution, negative share, rating trend (last 90 days vs older), top complaint themes in 1-3 star reviews (bugs, authorization, permissions, quota limits, pricing, Google integration, support...) with example quotes, feature requests, frequent phrases, developer reply rate and median reply time. With 2+ apps also one \"review-comparison\" row: complaint themes per 100 reviews for every app, relative weaknesses and strengths. Review rows themselves are output only when 'Include reviews' is on. Rule-based, no AI. Billed per insights row.",
            "default": false
          },
          "includeMarketReport": {
            "title": "Add market report per query",
            "type": "boolean",
            "description": "Add one recordType \"market-report\" row per search term / category: apps and developers count, total and median exact installs, installs distribution, install concentration (top app / top 3 / top 10 share), average and review-weighted rating, rating distribution, reviews per 1,000 installs, works-with mix, pricing mix, EU trader status, listing freshness, top developers by installs, top apps and weak incumbents (10K+ installs, rating under 3.8). With includeDetails: OAuth scope stats. With trackChanges / a monitor mode: sinceLastRun (new apps, installs growth, fastest growing apps). Also saved to the MARKET_REPORT record.",
            "default": false
          },
          "marketReportOnly": {
            "title": "Market report only (no app rows)",
            "type": "boolean",
            "description": "Output only the market report rows. Apps are analysed but not output or charged; reviews, details and outputMode are ignored. Turn on trackChanges with a stateKey to get the sinceLastRun section on scheduled runs.",
            "default": false
          },
          "outputMode": {
            "title": "Output mode",
            "enum": [
              "all",
              "new",
              "changed"
            ],
            "type": "string",
            "description": "\"new\" and \"changed\" compare with the previous run that used the same stateKey. The first run is the baseline and returns everything.",
            "default": "all"
          },
          "trackChanges": {
            "title": "Add change fields in \"all\" mode",
            "type": "boolean",
            "description": "Also compute installsChange, rankChange, changeTypes etc. when outputMode is \"all\" (saves a snapshot for the next run).",
            "default": false
          },
          "minInstallsChangePct": {
            "title": "Min installs change (%)",
            "minimum": 0,
            "type": "number",
            "description": "An installs-up / installs-down change is reported only when installs moved at least this many percent since the last run.",
            "default": 2
          },
          "minRankChange": {
            "title": "Min rank change",
            "minimum": 1,
            "type": "integer",
            "description": "A rank-up / rank-down change is reported only when the app moved at least this many positions in a search or category list.",
            "default": 5
          },
          "stateKey": {
            "title": "Monitor name (stateKey)",
            "type": "string",
            "description": "Name of the saved snapshot used by \"new\" / \"changed\" modes. Use a different name for each schedule or watchlist.",
            "default": "default"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}