{
  "data": {
    "id": "mQKNO4t6I3leVDPHs",
    "actId": "gwPRRDAv7ARz2kf6J",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-11-07T23:51:55.807Z",
    "finishedAt": "2026-11-07T23:51:59.032Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 3152,
      "runTimeSecs": 3.152,
      "computeUnits": 0.003502222222222222,
      "imageSizeBytes": 318986240
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Google Workspace Marketplace Category Tracker Input\",\n  \"description\": \"Track Google Workspace Marketplace apps, categories, search results and reviews. No login or API key required.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"What to scrape\",\n      \"type\": \"string\",\n      \"description\": \"Pick a category/curated list, a keyword search, specific apps, or their reviews.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"category\",\n        \"search\",\n        \"appDetails\",\n        \"reviews\"\n      ],\n      \"enumTitles\": [\n        \"Category or curated list\",\n        \"Keyword search\",\n        \"Specific apps (ID or URL)\",\n        \"App reviews\"\n      ],\n      \"default\": \"category\",\n      \"prefill\": \"category\",\n      \"sectionCaption\": \"What to scrape\"\n    },\n    \"categories\": {\n      \"title\": \"Categories (mode=category)\",\n      \"type\": \"array\",\n      \"description\": \"One or more marketplace categories or curated lists. All selected categories are unioned and deduplicated.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"popular-apps\",\n          \"top-rated\",\n          \"featured-partner-apps\",\n          \"recommended\",\n          \"work-from-everywhere\",\n          \"business-essentials\",\n          \"apps-to-discover\",\n          \"google-apps\",\n          \"connectors\",\n          \"business-tools\",\n          \"business-tools/accounting-and-finance\",\n          \"business-tools/administration-and-management\",\n          \"business-tools/erp-and-logistics\",\n          \"business-tools/hr-and-legal\",\n          \"business-tools/marketing-and-analytics\",\n          \"business-tools/sales-and-crm\",\n          \"productivity\",\n          \"productivity/creative-tools\",\n          \"productivity/web-development\",\n          \"productivity/office-applications\",\n          \"productivity/task-management\",\n          \"education\",\n          \"education/academic-resources\",\n          \"education/teacher-and-admin-tools\",\n          \"communication\",\n          \"utilities\",\n          \"enterprise-apps\"\n        ],\n        \"enumTitles\": [\n          \"Most Popular\",\n          \"Top Rated\",\n          \"Featured Partner Apps\",\n          \"Recommended for Google Workspace\",\n          \"Work from Everywhere\",\n          \"Business Essentials\",\n          \"Apps to Discover\",\n          \"Built by Google\",\n          \"Connectors (Gemini / Studio)\",\n          \"Business Tools (all)\",\n          \"Business Tools — Accounting & Finance\",\n          \"Business Tools — Administration & Management\",\n          \"Business Tools — ERP & Logistics\",\n          \"Business Tools — HR & Legal\",\n          \"Business Tools — Marketing & Analytics\",\n          \"Business Tools — Sales & CRM\",\n          \"Productivity (all)\",\n          \"Productivity — Creative Tools\",\n          \"Productivity — Web Development\",\n          \"Productivity — Office Applications\",\n          \"Productivity — Task Management\",\n          \"Education (all)\",\n          \"Education — Academic Resources\",\n          \"Education — Teacher & Admin Tools\",\n          \"Communication\",\n          \"Utilities\",\n          \"Enterprise / Admin Managed\"\n        ]\n      },\n      \"default\": [\n        \"popular-apps\"\n      ],\n      \"prefill\": [\n        \"popular-apps\"\n      ],\n      \"sectionCaption\": \"Category and search\"\n    },\n    \"searchQueries\": {\n      \"title\": \"Search queries (mode=search)\",\n      \"type\": \"array\",\n      \"description\": \"Keywords to search in the marketplace, e.g. \\\"mail merge\\\", \\\"crm\\\", \\\"pdf\\\". Each query is ranked separately and results are deduplicated.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": []\n    },\n    \"appIds\": {\n      \"title\": \"App IDs or URLs (mode=appDetails or reviews)\",\n      \"type\": \"array\",\n      \"description\": \"Numeric app IDs or full marketplace app URLs, e.g. 7081045131 or https://workspace.google.com/marketplace/app/lucidchart/7081045131.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": []\n    },\n    \"worksWith\": {\n      \"title\": \"Works with\",\n      \"type\": \"string\",\n      \"description\": \"Only keep apps that integrate with this Google app. Applied to listings and app lookups.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"drive\",\n        \"docs\",\n        \"sheets\",\n        \"slides\",\n        \"forms\",\n        \"gmail\",\n        \"calendar\",\n        \"chat\",\n        \"meet\",\n        \"classroom\",\n        \"gemini\",\n        \"studio\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"Google Drive\",\n        \"Google Docs\",\n        \"Google Sheets\",\n        \"Google Slides\",\n        \"Google Forms\",\n        \"Gmail\",\n        \"Google Calendar\",\n        \"Google Chat\",\n        \"Google Meet\",\n        \"Google Classroom\",\n        \"Gemini\",\n        \"Workspace Studio\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\",\n      \"sectionCaption\": \"Filters\"\n    },\n    \"pricing\": {\n      \"title\": \"Pricing model\",\n      \"type\": \"string\",\n      \"description\": \"Only keep apps with this pricing model. Apps that do not state pricing are excluded when a specific model is selected.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"free\",\n        \"free-trial\",\n        \"freemium\",\n        \"paid\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"Free of charge\",\n        \"Free trial\",\n        \"Freemium\",\n        \"Paid\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"minRating\": {\n      \"title\": \"Minimum rating\",\n      \"type\": \"number\",\n      \"description\": \"Only keep apps rated at least this (0–5). Leave 0 for any rating.\",\n      \"minimum\": 0,\n      \"maximum\": 5,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"minReviews\": {\n      \"title\": \"Minimum review count\",\n      \"type\": \"integer\",\n      \"description\": \"Only keep apps with at least this many ratings. Leave 0 for any.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000000,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"minInstalls\": {\n      \"title\": \"Minimum installs\",\n      \"type\": \"integer\",\n      \"description\": \"Only keep apps with at least this many exact installs. Leave 0 for any.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000000000,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"developerFilter\": {\n      \"title\": \"Developer contains\",\n      \"type\": \"string\",\n      \"description\": \"Only keep apps whose developer name or website contains this text, e.g. \\\"zoho\\\" or \\\"lucidchart.com\\\".\",\n      \"editor\": \"textfield\",\n      \"default\": \"\"\n    },\n    \"includeDetails\": {\n      \"title\": \"Include OAuth permissions and security badge\",\n      \"type\": \"boolean\",\n      \"description\": \"Open each app page to add the exact OAuth scopes, sensitive-access flags and independent security-verification badge. Adds one request per app.\",\n      \"default\": false,\n      \"prefill\": false,\n      \"sectionCaption\": \"Extra app data\"\n    },\n    \"includeReviews\": {\n      \"title\": \"Include reviews\",\n      \"type\": \"boolean\",\n      \"description\": \"Also output the reviews of every matched app as separate rows (recordType workspace_review). Adds one app page request plus up to maxReviewsPerApp / 10 review-page requests per app.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"sortBy\": {\n      \"title\": \"Review order\",\n      \"type\": \"string\",\n      \"description\": \"Order of reviews when reviews are collected.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"helpful\",\n        \"recent\"\n      ],\n      \"enumTitles\": [\n        \"Most helpful\",\n        \"Newest first\"\n      ],\n      \"default\": \"helpful\",\n      \"prefill\": \"helpful\",\n      \"sectionCaption\": \"Review options\"\n    },\n    \"minReviewRating\": {\n      \"title\": \"Minimum review stars\",\n      \"type\": \"integer\",\n      \"description\": \"Only include reviews with at least this star rating (1–5).\",\n      \"minimum\": 1,\n      \"maximum\": 5,\n      \"default\": 1,\n      \"prefill\": 1\n    },\n    \"maxReviewRating\": {\n      \"title\": \"Maximum review stars\",\n      \"type\": \"integer\",\n      \"description\": \"Only include reviews with at most this star rating (1–5). Set 2 for complaints only.\",\n      \"minimum\": 1,\n      \"maximum\": 5,\n      \"default\": 5,\n      \"prefill\": 5\n    },\n    \"reviewsSince\": {\n      \"title\": \"Reviews since\",\n      \"type\": \"string\",\n      \"description\": \"Only include reviews posted on or after this date, e.g. 2026-01-01. Leave blank for no date limit.\",\n      \"editor\": \"textfield\",\n      \"default\": \"\"\n    },\n    \"maxReviewsPerApp\": {\n      \"title\": \"Max reviews per app\",\n      \"type\": \"integer\",\n      \"description\": \"Stop after this many matching reviews per app.\",\n      \"minimum\": 1,\n      \"maximum\": 2000,\n      \"default\": 50,\n      \"prefill\": 50\n    },\n    \"includeCategoryMembership\": {\n      \"title\": \"Resolve category membership\",\n      \"type\": \"boolean\",\n      \"description\": \"Scan all 27 category listings to fill each app's categories list (top-100 listings only). Adds 27 requests.\",\n      \"default\": false,\n      \"prefill\": false,\n      \"sectionCaption\": \"Output\"\n    },\n    \"maxItems\": {\n      \"title\": \"Max app records\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum app rows to return. Listings are fetched in slices until this many matching apps are found (or the marketplace is exhausted). In reviews mode this caps review rows instead.\",\n      \"minimum\": 1,\n      \"maximum\": 5000,\n      \"default\": 100,\n      \"prefill\": 3\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Google Workspace Marketplace Category Tracker\n\nTrack ranked apps across every Google Workspace Marketplace category, run keyword searches, look up specific apps, and pull their public reviews — without a Google account, API key or proxy.\n\nThe actor reads the same public pages and embedded JSON the marketplace serves to a browser. Listings are capped at 100 apps per request, so the actor automatically unions Google's own rating, pricing and \"works with\" slices to reach deeper into a category when you ask for more rows.\n\n## What it does\n\n- **Category tracking** — 27 categories and curated lists (Most Popular, Top Rated, Featured Partner Apps, Business Tools, Productivity, Education, Connectors and every subcategory), with site rank preserved for the default slice.\n- **Keyword search** — one or more queries, ranked separately and deduplicated.\n- **App lookup** — pass numeric IDs or full marketplace URLs and get the complete public listing.\n- **Reviews** — paginated review rows (10 at a time) with rating, text, date, helpful votes and reviewer name; filter by star range and date, sort by helpful or newest.\n- **Real filters** — works-with host, pricing model, minimum rating, review count, installs and developer substring.\n- **Extra detail** — exact OAuth scopes, sensitive-access flags and the independent security-verification badge for each app.\n- **Deep listings** — when `maxItems` exceeds what the default page returns, the actor fetches additional rating/pricing/host slices and deduplicates by app ID.\n- **Omit-empty output** — a field the marketplace does not publish is left out of that record, never `null` or a placeholder.\n\n## Modes\n\n| Mode | What it returns | Required input |\n|---|---|---|\n| `category` (default) | Ranked apps from one or more categories or curated lists | `categories` (defaults to `popular-apps`) |\n| `search` | Ranked apps for one or more keyword queries | `searchQueries` |\n| `appDetails` | Full records for specific apps | `appIds` |\n| `reviews` | Review rows only | `appIds` |\n\nAdd `includeReviews` to `category`, `search` or `appDetails` to emit app rows and review rows in the same run.\n\n## Input options\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select | `category` | What to scrape |\n| `categories` | multi-select | `[\"popular-apps\"]` | Category/curated-list slugs (mode=category) |\n| `searchQueries` | string list | — | Keywords (mode=search) |\n| `appIds` | string list | — | Numeric IDs or marketplace URLs (appDetails/reviews) |\n| `worksWith` | select | `any` | Drive, Docs, Sheets, Slides, Forms, Gmail, Calendar, Chat, Meet, Classroom, Gemini, Studio |\n| `pricing` | select | `any` | Free, Free trial, Freemium, Paid |\n| `minRating` | number | `0` | Keep apps rated at least this (0–5) |\n| `minReviews` | integer | `0` | Keep apps with at least this many ratings |\n| `minInstalls` | integer | `0` | Keep apps with at least this many exact installs |\n| `developerFilter` | text | — | Keep apps whose developer name or website contains this text |\n| `includeDetails` | boolean | `false` | Add OAuth scopes, sensitive-access flags and security badge |\n| `includeReviews` | boolean | `false` | Emit review rows for matched apps |\n| `sortBy` | select | `helpful` | `helpful` or `recent` |\n| `minReviewRating` | integer | `1` | Lowest review star rating to keep |\n| `maxReviewRating` | integer | `5` | Highest review star rating to keep |\n| `reviewsSince` | text | — | ISO date, e.g. `2026-01-01` |\n| `maxReviewsPerApp` | integer | `50` | Review cap per app |\n| `includeCategoryMembership` | boolean | `false` | Scan all 27 listings to fill each app's `categories` |\n| `maxItems` | integer | `100` | Max app rows (max review rows in `reviews` mode) |\n\n## Output fields\n\n### App rows (`recordType: \"workspace_app\"`)\n\n| Field | Description |\n|---|---|\n| `rankInCategory` | 1-based rank in the category's default listing (omitted for apps only found in later slices) |\n| `rankInResults` | 1-based rank in the keyword search default listing |\n| `category` / `categories` | Selected category and (when resolved) the app's category memberships |\n| `searchQuery` / `searchQueries` | Keyword that matched the app |\n| `appId`, `slug`, `name` | Identity |\n| `shortDescription`, `longDescription` | Listing descriptions |\n| `developer`, `developerWebsite` | Publisher |\n| `rating`, `reviewCount` | Average stars and rating count |\n| `installCount`, `installsLabel` | Exact installs (e.g. `97456341`) and the public band (e.g. `97M+`) |\n| `pricingModel` | `Free`, `Free trial`, `Freemium` or `Paid` (omitted when the listing does not state pricing) |\n| `worksWith` | Google apps the listing works with |\n| `lastUpdated` | Listing update date (`YYYY-MM-DD`) |\n| `iconUrl`, `bannerUrl`, `screenshots` | Public image URLs |\n| `supportUrl`, `privacyPolicyUrl`, `termsOfServiceUrl` | Links published on the listing |\n| `appUrl`, `sourceUrl` | Canonical marketplace app page |\n| `securityVerified` | `true` when the independent security-verification badge is shown |\n| `oauthScopes`, `oauthScopeCount`, `sensitiveAccess` | Requested OAuth scopes and flags such as `gmailFullAccess` |\n| `recordType`, `scrapedAt` | Row metadata |\n\n### Review rows (`recordType: \"workspace_review\"`)\n\n`reviewId`, `appId`, `appName`, `appUrl`, `reviewerName`, `reviewerAvatarUrl`, `rating`, `reviewText`, `reviewDate`, `helpfulCount`, `sourceUrl`, `scrapedAt`.\n\n## Example inputs\n\nTrack the top 50 apps in a category, including OAuth permissions:\n\n```json\n{\n  \"mode\": \"category\",\n  \"categories\": [\"business-tools/sales-and-crm\"],\n  \"maxItems\": 50,\n  \"includeDetails\": true\n}\n```\n\nDeep-scan productivity with a filter, plus reviews:\n\n```json\n{\n  \"mode\": \"category\",\n  \"categories\": [\"productivity\"],\n  \"worksWith\": \"sheets\",\n  \"minRating\": 4,\n  \"maxItems\": 250,\n  \"includeReviews\": true,\n  \"sortBy\": \"recent\",\n  \"maxReviewRating\": 2,\n  \"maxReviewsPerApp\": 20\n}\n```\n\nLook up apps by URL or ID:\n\n```json\n{\n  \"mode\": \"appDetails\",\n  \"appIds\": [\n    \"https://workspace.google.com/marketplace/app/lucidchart/7081045131\",\n    \"1014160490159\"\n  ],\n  \"includeDetails\": true\n}\n```\n\nPull 100 newest reviews for one app:\n\n```json\n{\n  \"mode\": \"reviews\",\n  \"appIds\": [\"7081045131\"],\n  \"sortBy\": \"recent\",\n  \"maxItems\": 100\n}\n```\n\n## Example output\n\n```json\n{\n  \"recordType\": \"workspace_app\",\n  \"rankInCategory\": 1,\n  \"category\": \"productivity\",\n  \"categories\": [\"productivity\"],\n  \"appId\": \"1014160490159\",\n  \"slug\": \"colaboratory\",\n  \"name\": \"Colaboratory\",\n  \"shortDescription\": \"This allows Google Colaboratory to open and create files in Google Drive.\",\n  \"developer\": \"Colaboratory team\",\n  \"developerWebsite\": \"https://colab.research.google.com\",\n  \"rating\": 4.68,\n  \"reviewCount\": 3824,\n  \"installCount\": 97456341,\n  \"installsLabel\": \"97M+\",\n  \"worksWith\": [\"Drive\"],\n  \"lastUpdated\": \"2025-08-25\",\n  \"iconUrl\": \"https://lh3.googleusercontent.com/bY20qlnjiFpsT_MtcuOGIAZ70lsnGe00yNVFF4hWT3QCz0-r7Rk\",\n  \"appUrl\": \"https://workspace.google.com/marketplace/app/colaboratory/1014160490159\",\n  \"sourceUrl\": \"https://workspace.google.com/marketplace/app/colaboratory/1014160490159\",\n  \"scrapedAt\": \"2026-11-08T10:00:00+00:00\"\n}\n```\n\n## FAQ\n\n**Do I need a Google account, API key or proxy?**\nNo. Every field comes from public marketplace pages and their embedded JSON. The actor makes direct HTTP requests and needs no credentials.\n\n**How do I get more than 100 apps from one category?**\nThe marketplace returns at most 100 apps per request. The actor works around this by fetching the category through Google's own rating, pricing and works-with slices and merging the results. Set `maxItems` above 100 to enable the extra slices. Very broad categories can still be deeper than the slice union; split them by subcategory or add a works-with filter for full coverage of a narrower slice.\n\n**Why is `rankInCategory` missing on some rows?**\nRank comes from the category's default (unsliced) page. Apps that only appear in a later slice have no position on that page, so the field is omitted rather than invented.\n\n**Why do some apps have no `pricingModel`?**\nSome listings do not state pricing. That row simply omits the field instead of guessing \"Free\".\n\n**How many reviews can I get?**\nThe actor pages through the marketplace's review endpoint 10 at a time, up to `maxReviewsPerApp` (maximum 2,000). The marketplace may report slightly different totals between calls, so reviews are deduplicated by review ID and the actor stops when a page adds nothing new.\n\n**Can I get developer replies to reviews?**\nNo. The public review payload does not contain developer replies, so the actor does not invent them.\n\n**What does `includeCategoryMembership` do?**\nThe marketplace does not expose an app's category list on its app page. That option scans all 27 category listings and records which ones include the app. Because each listing shows at most 100 apps, membership is limited to those listing pages.\n\n**What are `sensitiveAccess` flags?**\nThey summarise OAuth scopes: `gmailFullAccess`, `driveFullAccess`, `calendarFullAccess`, `contacts` and `adminDirectory`. Use them to audit what an add-on can access before installing it.\n\n**Can I monitor changes between runs?**\nExport the dataset on a schedule and compare snapshots. This actor returns current data; it does not store state.\n\n## Limitations\n\n- Each marketplace listing request is capped at 100 apps. Deep listing coverage is best-effort through Google's rating, pricing and works-with slices.\n- Google ignores the Gemini and Studio host filters on listing URLs; those works-with values are applied to the rows the actor already fetched.\n- Category membership is limited to the top-100 page of each category.\n- Review totals reported by the marketplace fluctuate; review pagination stops at the reported total or when three consecutive pages add nothing new.\n- Developer replies, emails, phone numbers and trader addresses are not published in the listing payload and are not fabricated.\n\n## Data source\n\nPublic pages under `workspace.google.com/marketplace`: category and curated-list pages, search results, app detail pages, and the marketplace's own review endpoint. This actor is independent and not affiliated with Google.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "google-workspace-marketplace-category-tracker",
      "title": "Google Workspace Marketplace Category Tracker",
      "description": "Track Google Workspace Marketplace categories, keyword searches, specific apps and reviews. Returns ranked apps with exact installs, ratings, pricing, works-with hosts, OAuth permissions, links and optional review rows — no login or API key.",
      "version": "1.1",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Google Workspace Marketplace Category Tracker\n\nTrack ranked apps across every Google Workspace Marketplace category, run keyword searches, look up specific apps, and pull their public reviews — without a Google account, API key or proxy.\n\nThe actor reads the same public pages and embedded JSON the marketplace serves to a browser. Listings are capped at 100 apps per request, so the actor automatically unions Google's own rating, pricing and \"works with\" slices to reach deeper into a category when you ask for more rows.\n\n## What it does\n\n- **Category tracking** — 27 categories and curated lists (Most Popular, Top Rated, Featured Partner Apps, Business Tools, Productivity, Education, Connectors and every subcategory), with site rank preserved for the default slice.\n- **Keyword search** — one or more queries, ranked separately and deduplicated.\n- **App lookup** — pass numeric IDs or full marketplace URLs and get the complete public listing.\n- **Reviews** — paginated review rows (10 at a time) with rating, text, date, helpful votes and reviewer name; filter by star range and date, sort by helpful or newest.\n- **Real filters** — works-with host, pricing model, minimum rating, review count, installs and developer substring.\n- **Extra detail** — exact OAuth scopes, sensitive-access flags and the independent security-verification badge for each app.\n- **Deep listings** — when `maxItems` exceeds what the default page returns, the actor fetches additional rating/pricing/host slices and deduplicates by app ID.\n- **Omit-empty output** — a field the marketplace does not publish is left out of that record, never `null` or a placeholder.\n\n## Modes\n\n| Mode | What it returns | Required input |\n|---|---|---|\n| `category` (default) | Ranked apps from one or more categories or curated lists | `categories` (defaults to `popular-apps`) |\n| `search` | Ranked apps for one or more keyword queries | `searchQueries` |\n| `appDetails` | Full records for specific apps | `appIds` |\n| `reviews` | Review rows only | `appIds` |\n\nAdd `includeReviews` to `category`, `search` or `appDetails` to emit app rows and review rows in the same run.\n\n## Input options\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select | `category` | What to scrape |\n| `categories` | multi-select | `[\"popular-apps\"]` | Category/curated-list slugs (mode=category) |\n| `searchQueries` | string list | — | Keywords (mode=search) |\n| `appIds` | string list | — | Numeric IDs or marketplace URLs (appDetails/reviews) |\n| `worksWith` | select | `any` | Drive, Docs, Sheets, Slides, Forms, Gmail, Calendar, Chat, Meet, Classroom, Gemini, Studio |\n| `pricing` | select | `any` | Free, Free trial, Freemium, Paid |\n| `minRating` | number | `0` | Keep apps rated at least this (0–5) |\n| `minReviews` | integer | `0` | Keep apps with at least this many ratings |\n| `minInstalls` | integer | `0` | Keep apps with at least this many exact installs |\n| `developerFilter` | text | — | Keep apps whose developer name or website contains this text |\n| `includeDetails` | boolean | `false` | Add OAuth scopes, sensitive-access flags and security badge |\n| `includeReviews` | boolean | `false` | Emit review rows for matched apps |\n| `sortBy` | select | `helpful` | `helpful` or `recent` |\n| `minReviewRating` | integer | `1` | Lowest review star rating to keep |\n| `maxReviewRating` | integer | `5` | Highest review star rating to keep |\n| `reviewsSince` | text | — | ISO date, e.g. `2026-01-01` |\n| `maxReviewsPerApp` | integer | `50` | Review cap per app |\n| `includeCategoryMembership` | boolean | `false` | Scan all 27 listings to fill each app's `categories` |\n| `maxItems` | integer | `100` | Max app rows (max review rows in `reviews` mode) |\n\n## Output fields\n\n### App rows (`recordType: \"workspace_app\"`)\n\n| Field | Description |\n|---|---|\n| `rankInCategory` | 1-based rank in the category's default listing (omitted for apps only found in later slices) |\n| `rankInResults` | 1-based rank in the keyword search default listing |\n| `category` / `categories` | Selected category and (when resolved) the app's category memberships |\n| `searchQuery` / `searchQueries` | Keyword that matched the app |\n| `appId`, `slug`, `name` | Identity |\n| `shortDescription`, `longDescription` | Listing descriptions |\n| `developer`, `developerWebsite` | Publisher |\n| `rating`, `reviewCount` | Average stars and rating count |\n| `installCount`, `installsLabel` | Exact installs (e.g. `97456341`) and the public band (e.g. `97M+`) |\n| `pricingModel` | `Free`, `Free trial`, `Freemium` or `Paid` (omitted when the listing does not state pricing) |\n| `worksWith` | Google apps the listing works with |\n| `lastUpdated` | Listing update date (`YYYY-MM-DD`) |\n| `iconUrl`, `bannerUrl`, `screenshots` | Public image URLs |\n| `supportUrl`, `privacyPolicyUrl`, `termsOfServiceUrl` | Links published on the listing |\n| `appUrl`, `sourceUrl` | Canonical marketplace app page |\n| `securityVerified` | `true` when the independent security-verification badge is shown |\n| `oauthScopes`, `oauthScopeCount`, `sensitiveAccess` | Requested OAuth scopes and flags such as `gmailFullAccess` |\n| `recordType`, `scrapedAt` | Row metadata |\n\n### Review rows (`recordType: \"workspace_review\"`)\n\n`reviewId`, `appId`, `appName`, `appUrl`, `reviewerName`, `reviewerAvatarUrl`, `rating`, `reviewText`, `reviewDate`, `helpfulCount`, `sourceUrl`, `scrapedAt`.\n\n## Example inputs\n\nTrack the top 50 apps in a category, including OAuth permissions:\n\n```json\n{\n  \"mode\": \"category\",\n  \"categories\": [\"business-tools/sales-and-crm\"],\n  \"maxItems\": 50,\n  \"includeDetails\": true\n}\n```\n\nDeep-scan productivity with a filter, plus reviews:\n\n```json\n{\n  \"mode\": \"category\",\n  \"categories\": [\"productivity\"],\n  \"worksWith\": \"sheets\",\n  \"minRating\": 4,\n  \"maxItems\": 250,\n  \"includeReviews\": true,\n  \"sortBy\": \"recent\",\n  \"maxReviewRating\": 2,\n  \"maxReviewsPerApp\": 20\n}\n```\n\nLook up apps by URL or ID:\n\n```json\n{\n  \"mode\": \"appDetails\",\n  \"appIds\": [\n    \"https://workspace.google.com/marketplace/app/lucidchart/7081045131\",\n    \"1014160490159\"\n  ],\n  \"includeDetails\": true\n}\n```\n\nPull 100 newest reviews for one app:\n\n```json\n{\n  \"mode\": \"reviews\",\n  \"appIds\": [\"7081045131\"],\n  \"sortBy\": \"recent\",\n  \"maxItems\": 100\n}\n```\n\n## Example output\n\n```json\n{\n  \"recordType\": \"workspace_app\",\n  \"rankInCategory\": 1,\n  \"category\": \"productivity\",\n  \"categories\": [\"productivity\"],\n  \"appId\": \"1014160490159\",\n  \"slug\": \"colaboratory\",\n  \"name\": \"Colaboratory\",\n  \"shortDescription\": \"This allows Google Colaboratory to open and create files in Google Drive.\",\n  \"developer\": \"Colaboratory team\",\n  \"developerWebsite\": \"https://colab.research.google.com\",\n  \"rating\": 4.68,\n  \"reviewCount\": 3824,\n  \"installCount\": 97456341,\n  \"installsLabel\": \"97M+\",\n  \"worksWith\": [\"Drive\"],\n  \"lastUpdated\": \"2025-08-25\",\n  \"iconUrl\": \"https://lh3.googleusercontent.com/bY20qlnjiFpsT_MtcuOGIAZ70lsnGe00yNVFF4hWT3QCz0-r7Rk\",\n  \"appUrl\": \"https://workspace.google.com/marketplace/app/colaboratory/1014160490159\",\n  \"sourceUrl\": \"https://workspace.google.com/marketplace/app/colaboratory/1014160490159\",\n  \"scrapedAt\": \"2026-11-08T10:00:00+00:00\"\n}\n```\n\n## FAQ\n\n**Do I need a Google account, API key or proxy?**\nNo. Every field comes from public marketplace pages and their embedded JSON. The actor makes direct HTTP requests and needs no credentials.\n\n**How do I get more than 100 apps from one category?**\nThe marketplace returns at most 100 apps per request. The actor works around this by fetching the category through Google's own rating, pricing and works-with slices and merging the results. Set `maxItems` above 100 to enable the extra slices. Very broad categories can still be deeper than the slice union; split them by subcategory or add a works-with filter for full coverage of a narrower slice.\n\n**Why is `rankInCategory` missing on some rows?**\nRank comes from the category's default (unsliced) page. Apps that only appear in a later slice have no position on that page, so the field is omitted rather than invented.\n\n**Why do some apps have no `pricingModel`?**\nSome listings do not state pricing. That row simply omits the field instead of guessing \"Free\".\n\n**How many reviews can I get?**\nThe actor pages through the marketplace's review endpoint 10 at a time, up to `maxReviewsPerApp` (maximum 2,000). The marketplace may report slightly different totals between calls, so reviews are deduplicated by review ID and the actor stops when a page adds nothing new.\n\n**Can I get developer replies to reviews?**\nNo. The public review payload does not contain developer replies, so the actor does not invent them.\n\n**What does `includeCategoryMembership` do?**\nThe marketplace does not expose an app's category list on its app page. That option scans all 27 category listings and records which ones include the app. Because each listing shows at most 100 apps, membership is limited to those listing pages.\n\n**What are `sensitiveAccess` flags?**\nThey summarise OAuth scopes: `gmailFullAccess`, `driveFullAccess`, `calendarFullAccess`, `contacts` and `adminDirectory`. Use them to audit what an add-on can access before installing it.\n\n**Can I monitor changes between runs?**\nExport the dataset on a schedule and compare snapshots. This actor returns current data; it does not store state.\n\n## Limitations\n\n- Each marketplace listing request is capped at 100 apps. Deep listing coverage is best-effort through Google's rating, pricing and works-with slices.\n- Google ignores the Gemini and Studio host filters on listing URLs; those works-with values are applied to the rows the actor already fetched.\n- Category membership is limited to the top-100 page of each category.\n- Review totals reported by the marketplace fluctuate; review pagination stops at the reported total or when three consecutive pages add nothing new.\n- Developer replies, emails, phone numbers and trader addresses are not published in the listing payload and are not fabricated.\n\n## Data source\n\nPublic pages under `workspace.google.com/marketplace`: category and curated-list pages, search results, app detail pages, and the marketplace's own review endpoint. This actor is independent and not affiliated with Google.\n",
      "input": {
        "title": "Google Workspace Marketplace Category Tracker Input",
        "description": "Track Google Workspace Marketplace apps, categories, search results and reviews. No login or API key required.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "What to scrape",
            "type": "string",
            "description": "Pick a category/curated list, a keyword search, specific apps, or their reviews.",
            "editor": "select",
            "enum": [
              "category",
              "search",
              "appDetails",
              "reviews"
            ],
            "enumTitles": [
              "Category or curated list",
              "Keyword search",
              "Specific apps (ID or URL)",
              "App reviews"
            ],
            "default": "category",
            "prefill": "category",
            "sectionCaption": "What to scrape"
          },
          "categories": {
            "title": "Categories (mode=category)",
            "type": "array",
            "description": "One or more marketplace categories or curated lists. All selected categories are unioned and deduplicated.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "popular-apps",
                "top-rated",
                "featured-partner-apps",
                "recommended",
                "work-from-everywhere",
                "business-essentials",
                "apps-to-discover",
                "google-apps",
                "connectors",
                "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/web-development",
                "productivity/office-applications",
                "productivity/task-management",
                "education",
                "education/academic-resources",
                "education/teacher-and-admin-tools",
                "communication",
                "utilities",
                "enterprise-apps"
              ],
              "enumTitles": [
                "Most Popular",
                "Top Rated",
                "Featured Partner Apps",
                "Recommended for Google Workspace",
                "Work from Everywhere",
                "Business Essentials",
                "Apps to Discover",
                "Built by Google",
                "Connectors (Gemini / Studio)",
                "Business Tools (all)",
                "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 (all)",
                "Productivity — Creative Tools",
                "Productivity — Web Development",
                "Productivity — Office Applications",
                "Productivity — Task Management",
                "Education (all)",
                "Education — Academic Resources",
                "Education — Teacher & Admin Tools",
                "Communication",
                "Utilities",
                "Enterprise / Admin Managed"
              ]
            },
            "default": [
              "popular-apps"
            ],
            "prefill": [
              "popular-apps"
            ],
            "sectionCaption": "Category and search"
          },
          "searchQueries": {
            "title": "Search queries (mode=search)",
            "type": "array",
            "description": "Keywords to search in the marketplace, e.g. \"mail merge\", \"crm\", \"pdf\". Each query is ranked separately and results are deduplicated.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "appIds": {
            "title": "App IDs or URLs (mode=appDetails or reviews)",
            "type": "array",
            "description": "Numeric app IDs or full marketplace app URLs, e.g. 7081045131 or https://workspace.google.com/marketplace/app/lucidchart/7081045131.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "worksWith": {
            "title": "Works with",
            "type": "string",
            "description": "Only keep apps that integrate with this Google app. Applied to listings and app lookups.",
            "editor": "select",
            "enum": [
              "any",
              "drive",
              "docs",
              "sheets",
              "slides",
              "forms",
              "gmail",
              "calendar",
              "chat",
              "meet",
              "classroom",
              "gemini",
              "studio"
            ],
            "enumTitles": [
              "Any",
              "Google Drive",
              "Google Docs",
              "Google Sheets",
              "Google Slides",
              "Google Forms",
              "Gmail",
              "Google Calendar",
              "Google Chat",
              "Google Meet",
              "Google Classroom",
              "Gemini",
              "Workspace Studio"
            ],
            "default": "any",
            "prefill": "any",
            "sectionCaption": "Filters"
          },
          "pricing": {
            "title": "Pricing model",
            "type": "string",
            "description": "Only keep apps with this pricing model. Apps that do not state pricing are excluded when a specific model is selected.",
            "editor": "select",
            "enum": [
              "any",
              "free",
              "free-trial",
              "freemium",
              "paid"
            ],
            "enumTitles": [
              "Any",
              "Free of charge",
              "Free trial",
              "Freemium",
              "Paid"
            ],
            "default": "any",
            "prefill": "any"
          },
          "minRating": {
            "title": "Minimum rating",
            "type": "number",
            "description": "Only keep apps rated at least this (0–5). Leave 0 for any rating.",
            "minimum": 0,
            "maximum": 5,
            "default": 0,
            "prefill": 0
          },
          "minReviews": {
            "title": "Minimum review count",
            "type": "integer",
            "description": "Only keep apps with at least this many ratings. Leave 0 for any.",
            "minimum": 0,
            "maximum": 1000000000,
            "default": 0,
            "prefill": 0
          },
          "minInstalls": {
            "title": "Minimum installs",
            "type": "integer",
            "description": "Only keep apps with at least this many exact installs. Leave 0 for any.",
            "minimum": 0,
            "maximum": 1000000000000,
            "default": 0,
            "prefill": 0
          },
          "developerFilter": {
            "title": "Developer contains",
            "type": "string",
            "description": "Only keep apps whose developer name or website contains this text, e.g. \"zoho\" or \"lucidchart.com\".",
            "editor": "textfield",
            "default": ""
          },
          "includeDetails": {
            "title": "Include OAuth permissions and security badge",
            "type": "boolean",
            "description": "Open each app page to add the exact OAuth scopes, sensitive-access flags and independent security-verification badge. Adds one request per app.",
            "default": false,
            "prefill": false,
            "sectionCaption": "Extra app data"
          },
          "includeReviews": {
            "title": "Include reviews",
            "type": "boolean",
            "description": "Also output the reviews of every matched app as separate rows (recordType workspace_review). Adds one app page request plus up to maxReviewsPerApp / 10 review-page requests per app.",
            "default": false,
            "prefill": false
          },
          "sortBy": {
            "title": "Review order",
            "type": "string",
            "description": "Order of reviews when reviews are collected.",
            "editor": "select",
            "enum": [
              "helpful",
              "recent"
            ],
            "enumTitles": [
              "Most helpful",
              "Newest first"
            ],
            "default": "helpful",
            "prefill": "helpful",
            "sectionCaption": "Review options"
          },
          "minReviewRating": {
            "title": "Minimum review stars",
            "type": "integer",
            "description": "Only include reviews with at least this star rating (1–5).",
            "minimum": 1,
            "maximum": 5,
            "default": 1,
            "prefill": 1
          },
          "maxReviewRating": {
            "title": "Maximum review stars",
            "type": "integer",
            "description": "Only include reviews with at most this star rating (1–5). Set 2 for complaints only.",
            "minimum": 1,
            "maximum": 5,
            "default": 5,
            "prefill": 5
          },
          "reviewsSince": {
            "title": "Reviews since",
            "type": "string",
            "description": "Only include reviews posted on or after this date, e.g. 2026-01-01. Leave blank for no date limit.",
            "editor": "textfield",
            "default": ""
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app",
            "type": "integer",
            "description": "Stop after this many matching reviews per app.",
            "minimum": 1,
            "maximum": 2000,
            "default": 50,
            "prefill": 50
          },
          "includeCategoryMembership": {
            "title": "Resolve category membership",
            "type": "boolean",
            "description": "Scan all 27 category listings to fill each app's categories list (top-100 listings only). Adds 27 requests.",
            "default": false,
            "prefill": false,
            "sectionCaption": "Output"
          },
          "maxItems": {
            "title": "Max app records",
            "type": "integer",
            "description": "Maximum app rows to return. Listings are fetched in slices until this many matching apps are found (or the marketplace is exhausted). In reviews mode this caps review rows instead.",
            "minimum": 1,
            "maximum": 5000,
            "default": 100,
            "prefill": 3
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Google Workspace Marketplace Category Tracker Output",
        "description": "Ranked marketplace apps with exact installs, ratings, pricing, works-with hosts, OAuth permissions, links and optional user reviews.",
        "properties": {
          "apps": {
            "type": "string",
            "title": "Marketplace apps",
            "description": "Dataset containing apps with rank, metadata, URLs, works-with hosts and optional OAuth permission data.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "reviews": {
            "type": "string",
            "title": "App reviews",
            "description": "Dataset containing review rows when includeReviews is on or mode=reviews.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "defaultMemoryMbytes": 1024,
      "minMemoryMbytes": 1024,
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "apps": {
              "title": "Marketplace apps",
              "transformation": {
                "fields": [
                  "recordType",
                  "rankInCategory",
                  "name",
                  "developer",
                  "rating",
                  "reviewCount",
                  "installCount",
                  "pricingModel",
                  "worksWith",
                  "appUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            },
            "reviews": {
              "title": "App reviews",
              "transformation": {
                "fields": [
                  "recordType",
                  "appName",
                  "rating",
                  "reviewText",
                  "reviewDate",
                  "helpfulCount",
                  "reviewerName"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.1.1",
    "imageDigest": "4af927521637a3a6b960a49f05e1d3f8835d6d0193c0a940e293b3a11c906c0f",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.003502222222222222
    }
  }
}