{
  "data": {
    "id": "xvAeTRBBb3qKlgtcS",
    "actId": "d8EIDG8VY8GDIfdge",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-10T08:45:13.196Z",
    "finishedAt": "2026-11-10T08:45:23.835Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 10558,
      "runTimeSecs": 10.558,
      "computeUnits": 0.01173111111111111,
      "imageSizeBytes": 319124992
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Google Workspace Marketplace Scraper Input\",\n  \"description\": \"Search apps, browse categories, enumerate the whole Marketplace, fetch apps by ID or URL, list a developer's apps, or export reviews.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to fetch. search=keyword search; byCategory=one category; browseAll=every category (deduplicated); byAppId=exact apps; byDeveloper=apps by publisher name (keyword search plus all category pages); reviews=review rows with optional rating/date filters.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"byCategory\",\n        \"browseAll\",\n        \"byAppId\",\n        \"byDeveloper\",\n        \"reviews\"\n      ],\n      \"enumTitles\": [\n        \"Search by keyword\",\n        \"Browse one category\",\n        \"Enumerate the whole Marketplace\",\n        \"Fetch specific apps by ID or URL\",\n        \"Find apps by developer\",\n        \"Export app reviews\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"search\"\n    },\n    \"searchQuery\": {\n      \"title\": \"Search query (mode=search)\",\n      \"type\": \"string\",\n      \"description\": \"Keyword to search for. Required in search mode. The Marketplace returns at most 100 apps per query.\",\n      \"editor\": \"textfield\",\n      \"default\": \"mail merge\",\n      \"prefill\": \"mail merge\"\n    },\n    \"category\": {\n      \"title\": \"Category (mode=byCategory)\",\n      \"type\": \"string\",\n      \"description\": \"Category or subcategory to browse. Required in byCategory mode.\",\n      \"editor\": \"select\",\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/office-applications\",\n        \"productivity/task-management\",\n        \"productivity/web-development\",\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 (formerly Integrations)\",\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 / Office applications\",\n        \"Productivity / Task management\",\n        \"Productivity / Web development\",\n        \"Education (all)\",\n        \"Education / Academic resources\",\n        \"Education / Teacher & admin tools\",\n        \"Communication\",\n        \"Utilities\",\n        \"Admin managed (Enterprise)\"\n      ],\n      \"default\": \"popular-apps\",\n      \"prefill\": \"popular-apps\"\n    },\n    \"appIds\": {\n      \"title\": \"App IDs or URLs (mode=byAppId / reviews)\",\n      \"type\": \"array\",\n      \"description\": \"Numeric Marketplace app IDs or full app URLs. Required for byAppId and reviews modes.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"developerName\": {\n      \"title\": \"Developer name (mode=byDeveloper)\",\n      \"type\": \"string\",\n      \"description\": \"Publisher/developer name to look up, e.g. `Lucid Software`. Required in byDeveloper mode.\",\n      \"editor\": \"textfield\"\n    },\n    \"worksWith\": {\n      \"title\": \"Works with\",\n      \"type\": \"string\",\n      \"description\": \"Keep only apps that integrate with this Google product. Applied to every app mode: search, byCategory, browseAll, byDeveloper and byAppId.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"drive\",\n        \"docs\",\n        \"sheets\",\n        \"slides\",\n        \"forms\",\n        \"gmail\",\n        \"calendar\",\n        \"chat\",\n        \"classroom\",\n        \"meet\"\n      ],\n      \"enumTitles\": [\n        \"Any Google product\",\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 Classroom\",\n        \"Google Meet\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\",\n      \"sectionCaption\": \"Filters\",\n      \"sectionDescription\": \"Optional filters applied to every app mode, including byAppId records.\"\n    },\n    \"pricing\": {\n      \"title\": \"Price option\",\n      \"type\": \"string\",\n      \"description\": \"Marketplace price facet: free = the app has a free option; paid = the app has a paid option. Applied to every app mode, including byAppId. Use the next field for an exact price class.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"free\",\n        \"paid\"\n      ],\n      \"enumTitles\": [\n        \"Any price\",\n        \"Has a free option\",\n        \"Has a paid option\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"pricingModel\": {\n      \"title\": \"Exact price class\",\n      \"type\": \"string\",\n      \"description\": \"Keep only apps with this exact published price class. Apps with no published price are omitted when a class is selected.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"Free\",\n        \"Freemium\",\n        \"Paid\"\n      ],\n      \"enumTitles\": [\n        \"Any class\",\n        \"Free\",\n        \"Freemium (free tier + paid features)\",\n        \"Paid\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"minRating\": {\n      \"title\": \"Minimum rating\",\n      \"type\": \"number\",\n      \"description\": \"Drop apps rated below this value (0–5). 0 = no minimum.\",\n      \"minimum\": 0,\n      \"maximum\": 5,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"minReviews\": {\n      \"title\": \"Minimum ratings count\",\n      \"type\": \"integer\",\n      \"description\": \"Drop apps with fewer ratings than this. 0 = no minimum.\",\n      \"minimum\": 0,\n      \"maximum\": 10000000,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"minInstalls\": {\n      \"title\": \"Minimum installs\",\n      \"type\": \"integer\",\n      \"description\": \"Drop apps installed fewer times than this (exact count). 0 = no minimum.\",\n      \"minimum\": 0,\n      \"maximum\": 10000000000,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"includeDetails\": {\n      \"title\": \"Include permissions and detail enrichment\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch each app's detail page to add OAuth permissions, exact Works-with icons and the text-review total. Adds one request per emitted app.\",\n      \"default\": false,\n      \"prefill\": false,\n      \"sectionCaption\": \"Details & reviews\",\n      \"sectionDescription\": \"Optional enrichment. Both options add extra requests per app; leave them off for the fastest, cheapest runs.\"\n    },\n    \"includeReviews\": {\n      \"title\": \"Include reviews on each app\",\n      \"type\": \"boolean\",\n      \"description\": \"Attach reviews to each app record. The rating and date filters below also apply. Ignored by reviews mode, which always emits review rows.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxReviewsPerApp\": {\n      \"title\": \"Max reviews per app\",\n      \"type\": \"integer\",\n      \"description\": \"How many matching reviews to attach in includeReviews, or how many to export per app in reviews mode.\",\n      \"minimum\": 1,\n      \"maximum\": 500,\n      \"default\": 30,\n      \"prefill\": 3\n    },\n    \"reviewSort\": {\n      \"title\": \"Review sort\",\n      \"type\": \"string\",\n      \"description\": \"Order of exported/attached reviews.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"recent\",\n        \"helpful\"\n      ],\n      \"enumTitles\": [\n        \"Most recent\",\n        \"Most helpful\"\n      ],\n      \"default\": \"recent\",\n      \"prefill\": \"recent\"\n    },\n    \"minReviewRating\": {\n      \"title\": \"Minimum review rating\",\n      \"type\": \"integer\",\n      \"description\": \"Drop reviews rated below this value (0-5). 0 = no minimum. Applies to reviews mode and includeReviews; filtering happens client-side over fetched review pages.\",\n      \"minimum\": 0,\n      \"maximum\": 5,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"maxReviewRating\": {\n      \"title\": \"Maximum review rating\",\n      \"type\": \"integer\",\n      \"description\": \"Drop reviews rated above this value (0-5). 0 = no maximum. Applies to reviews mode and includeReviews.\",\n      \"minimum\": 0,\n      \"maximum\": 5,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"reviewsSince\": {\n      \"title\": \"Reviews since\",\n      \"type\": \"string\",\n      \"description\": \"Drop reviews published before this date (YYYY-MM-DD). Leave empty for no date limit. Applies to reviews mode and includeReviews.\",\n      \"editor\": \"textfield\",\n      \"default\": \"\"\n    },\n    \"maxItems\": {\n      \"title\": \"Max items\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum records to emit. Search and category pages hold at most 100 apps each; browseAll can reach about 1,500 apps. In reviews mode this caps review rows.\",\n      \"minimum\": 1,\n      \"maximum\": 2000,\n      \"default\": 50,\n      \"prefill\": 3,\n      \"sectionCaption\": \"Output\",\n      \"sectionDescription\": \"How much data to return and which language the listing pages are read in.\"\n    },\n    \"language\": {\n      \"title\": \"Language\",\n      \"type\": \"string\",\n      \"description\": \"Language for listing text and review content.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"en\",\n        \"es\",\n        \"fr\",\n        \"de\",\n        \"pt\",\n        \"ja\",\n        \"zh\",\n        \"ko\",\n        \"it\",\n        \"nl\",\n        \"pl\",\n        \"ru\",\n        \"ar\",\n        \"tr\",\n        \"id\",\n        \"th\",\n        \"vi\",\n        \"sv\",\n        \"da\",\n        \"fi\",\n        \"no\",\n        \"cs\",\n        \"hu\",\n        \"ro\",\n        \"uk\"\n      ],\n      \"enumTitles\": [\n        \"English\",\n        \"Spanish\",\n        \"French\",\n        \"German\",\n        \"Portuguese\",\n        \"Japanese\",\n        \"Chinese\",\n        \"Korean\",\n        \"Italian\",\n        \"Dutch\",\n        \"Polish\",\n        \"Russian\",\n        \"Arabic\",\n        \"Turkish\",\n        \"Indonesian\",\n        \"Thai\",\n        \"Vietnamese\",\n        \"Swedish\",\n        \"Danish\",\n        \"Finnish\",\n        \"Norwegian\",\n        \"Czech\",\n        \"Hungarian\",\n        \"Romanian\",\n        \"Ukrainian\"\n      ],\n      \"default\": \"en\",\n      \"prefill\": \"en\"\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Google Workspace Marketplace App Search & Category Browser\n\nExplore the public [Google Workspace Marketplace](https://workspace.google.com/marketplace) without a Google account, API key, cookie, or proxy. Search by keyword, browse any of the 27 category views, sweep the entire Marketplace, look up exact apps by ID or URL, find every app from a publisher, or export reviews.\n\n## What this actor does\n\n- **Six modes:** `search`, `byCategory`, `browseAll`, `byAppId`, `byDeveloper`, `reviews`\n- **Full catalogue coverage:** `browseAll` enumerates every category view and deduplicates by app ID (~1,500 apps)\n- **Exact app lookup:** numeric Marketplace IDs, full app URLs, or a developer name\n- **Filters:** Works-with product, price option, exact price class, minimum rating, ratings count and installs\n- **Review export:** rating range and date filters, with attached reviews or standalone review rows\n- **Optional detail enrichment:** OAuth permissions, exact Works-with icons and written-review counts\n- **Empty fields are omitted** - never `null`, blank or placeholder values\n\n## Modes\n\n| Mode | What it does | Required field | Result ceiling |\n|---|---|---|---|\n| `search` | Keyword search across the Marketplace | `searchQuery` | 100 apps per query |\n| `byCategory` | Browse one of 27 categories/subcategories | `category` | 100 apps per category |\n| `browseAll` | Walk every category, deduplicate by app ID | — | ~1,500 apps |\n| `byAppId` | Fetch exact apps from numeric IDs or Marketplace URLs | `appIds` | no practical limit |\n| `byDeveloper` | Find every app from a publisher (keyword search plus all 27 category pages, deduplicated) | `developerName` | ~1,500 apps |\n| `reviews` | Export review rows for apps, with optional rating/date filters | `appIds` | up to `maxReviewsPerApp` per app |\n\n## Output per app\n\n- `appId`, `slug`, `name`, `developer`\n- `shortDescription` and full `description`\n- `rating` (0–5), `reviewCount` (number of ratings), `textReviewCount` (number of written reviews, filled in `byAppId` mode and when `includeReviews` is on)\n- `installCount` (exact integer) and `installCountText` (`46M+`)\n- `pricingModel` — `Free`, `Freemium`, or `Paid` when the listing publishes a price\n- `worksWith` — Google products the app integrates with (Docs, Sheets, Slides, Forms, Gmail, Calendar, Chat, Meet, Classroom, Drive, Workspace Studio)\n- `developerWebsite`, `developerEmail`, `developerAddress`\n- `termsUrl`, `privacyUrl`, `supportUrl`\n- `iconUrl`, `bannerUrl`, `screenshotUrls`\n- `lastUpdated` (ISO date), `appUrl` (canonical listing URL)\n- `permissions` — OAuth scopes with human-readable names (`includeDetails`)\n- `reviews` — review objects with rating, text, date, author (`includeReviews`)\n- `recordType` (`\"workspace_app\"`), `scrapedAt` (ISO timestamp)\n\nReview rows in `reviews` mode contain `appId`, `appName`, `appUrl`, `reviewId`, `rating`, `text`, `publishedAt`, `authorName` and `authorAvatarUrl`, with `recordType` set to `\"workspace_app_review\"`.\n\n## Filters\n\n- **Works with** — `drive`, `docs`, `sheets`, `slides`, `forms`, `gmail`, `calendar`, `chat`, `classroom`, `meet`\n- **Price option** — `free` (app has a free option) or `paid` (app has a paid option)\n- **Exact price class** — `Free`, `Freemium`, `Paid`\n- **Minimum rating**, **minimum ratings count**, **minimum installs**\n- **Review rating range** — `minReviewRating` / `maxReviewRating`\n- **Reviews since** — ISO date (`YYYY-MM-DD`)\n\nApp filters are applied consistently to search, category, all-marketplace, developer and exact-app results. Review filters apply to `reviews` mode and to reviews attached with `includeReviews`; they are evaluated client-side because the review endpoint only supports sort and paging.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select | `search` | `search` / `byCategory` / `browseAll` / `byAppId` / `byDeveloper` / `reviews` |\n| `searchQuery` | string | `mail merge` | Keyword search (mode=`search`) |\n| `category` | select | `popular-apps` | One of the 27 category views (mode=`byCategory`) |\n| `appIds` | array | `[]` | Numeric app IDs or full Marketplace URLs (mode=`byAppId` / `reviews`) |\n| `developerName` | string | – | Publisher/developer name (mode=`byDeveloper`) |\n| `worksWith` | select | `any` | Keep apps that integrate with this Google product; applies to every app mode |\n| `pricing` | select | `any` | `any` / `free` / `paid` price option |\n| `pricingModel` | select | `any` | `any` / `Free` / `Freemium` / `Paid` exact class |\n| `minRating` | number | `0` | Drop apps rated below this (0-5) |\n| `minReviews` | integer | `0` | Drop apps with fewer ratings |\n| `minInstalls` | integer | `0` | Drop apps with fewer exact installs |\n| `includeDetails` | boolean | `false` | Fetch OAuth permissions, exact Works-with icons and written-review totals (one extra request per app) |\n| `includeReviews` | boolean | `false` | Attach reviews to each app record |\n| `maxReviewsPerApp` | integer | `30` | Reviews attached per app, or exported per app in `reviews` mode (1-500) |\n| `reviewSort` | select | `recent` | `recent` / `helpful` |\n| `minReviewRating` | integer | `0` | Keep reviews at or above this rating (0-5) |\n| `maxReviewRating` | integer | `0` | Keep reviews at or below this rating (0-5) |\n| `reviewsSince` | string | – | Drop reviews before this date (`YYYY-MM-DD`) |\n| `maxItems` | integer | `50` | Maximum records to emit (1-2,000) |\n| `language` | select | `en` | Language for listing and review text (25 options) |\n\n## Examples\n\n### Search\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"mail merge\",\n  \"maxItems\": 30\n}\n```\n\n### Browse a category\n\n```json\n{\n  \"mode\": \"byCategory\",\n  \"category\": \"business-tools/sales-and-crm\",\n  \"maxItems\": 50\n}\n```\n\n### Enumerate the whole Marketplace\n\n```json\n{\n  \"mode\": \"browseAll\",\n  \"worksWith\": \"docs\",\n  \"pricing\": \"paid\",\n  \"maxItems\": 500\n}\n```\n\n### Fetch apps by ID or URL\n\n```json\n{\n  \"mode\": \"byAppId\",\n  \"appIds\": [\n    \"7081045131\",\n    \"https://workspace.google.com/marketplace/app/zip_extractor/824911851129\"\n  ],\n  \"includeDetails\": true\n}\n```\n\n### Export reviews\n\n```json\n{\n  \"mode\": \"reviews\",\n  \"appIds\": [\"7081045131\"],\n  \"maxReviewsPerApp\": 50,\n  \"reviewSort\": \"recent\",\n  \"maxItems\": 50\n}\n```\n\n### Export only recent one-star reviews\n\n```json\n{\n  \"mode\": \"reviews\",\n  \"appIds\": [\"7081045131\"],\n  \"reviewSort\": \"recent\",\n  \"maxReviewRating\": 1,\n  \"reviewsSince\": \"2026-01-01\",\n  \"maxItems\": 50\n}\n```\n\n### Search in German\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"crm\",\n  \"language\": \"de\",\n  \"maxItems\": 20\n}\n```\n\n## Output rules\n\nRecords are omit-empty: a field the Marketplace does not publish for an app is left out rather than emitted as `null`, `\"\"`, or a placeholder. URLs are absolute and use the scheme the listing publishes.\n\n## Use cases\n\n- **Market mapping** - enumerate the whole Marketplace to size a category or find every app in a workflow niche\n- **Competitive research** - compare installs, ratings, pricing and feature positioning across rivals\n- **Vendor and lead discovery** - collect developer names, websites and support contacts from app listings\n- **Review monitoring** - export recent low-star reviews for product-quality or support analysis\n- **Ecosystem tracking** - follow a publisher's app portfolio and detect new listings\n\n## Limits\n\n- A search or category page returns at most **100** apps; the Marketplace ignores pagination, sort and offset parameters. Use a narrower query or `browseAll` for wider coverage.\n- `browseAll` and `byDeveloper` can reach roughly **1,500** distinct apps across the 27 category views. Apps that appear in neither the category pages nor the search index cannot be discovered.\n- The Marketplace UI offers **Workspace Studio** and **Gemini** filters, but the corresponding `host` values are inert upstream, so they are not exposed.\n- Per-app category names are not published anywhere on the Marketplace; category membership is only visible by browsing category pages, so no `categories` field is emitted.\n- The review endpoint only supports sort order and 10-review offsets. Rating/date filters are applied client-side with a 50-page scan cap per app.\n- Change tracking and market reports are not provided: this actor is stateless and does not persist snapshots between runs.\n- Publisher links (support, privacy, terms, website) point to third-party sites; some of those sites block automated requests even though the link is valid.\n\n## FAQ\n\n**Does this need a Google account or API key?** No. The Marketplace is public and the actor reads it with no authentication, cookies, or proxy.\n\n**Why is a search limited to 100 apps?** The Marketplace serves a fixed top-100 list per query and ignores pagination parameters. Use a narrower query, or use `browseAll` to enumerate the whole catalogue.\n\n**Why did an app's price disappear?** The listing publishes a price class only for some apps. When it says \"Not available\", the field is omitted instead of guessing.\n\n**Why are categories not in the output?** The Marketplace does not expose per-app category names on an app's page or in its data. Category membership is only visible by browsing category pages, so the actor does not invent it.\n\n**How fresh are reviews?** Reviews are fetched live in 10-review pages, newest or most helpful first. `reviewCount` counts ratings; `textReviewCount` counts written reviews.\n\n**Can I filter reviews by date or rating?** Yes — use `minReviewRating`, `maxReviewRating` and `reviewsSince`. The Marketplace review endpoint itself only supports sort order and paging, so the actor pages through reviews and filters them client-side, scanning up to 50 pages (500 reviews) per app. A very restrictive filter can therefore return fewer rows than requested.\n\n**How complete is `byDeveloper`?** The Marketplace has no developer-search endpoint, so the actor combines keyword searches for the publisher name with a scan of all 27 category pages and keeps records whose developer matches the name. That reaches every app exposed by either surface; apps that appear on neither surface cannot be discovered.\n\n**Are screenshots and icons publicly accessible?** Yes — Google hosts them at `lh3.googleusercontent.com` and they return images from a clean client. Publisher websites linked from a listing can block automated requests with a 403; open those links in a browser.\n\n**Is this affiliated with Google?** No. This is an independent actor reading the public Google Workspace Marketplace and is not operated by or affiliated with Google.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "google-workspace-marketplace-app-search",
      "title": "Google Workspace Marketplace App Search & Category Browser",
      "description": "Search Google Workspace Marketplace apps, browse 27 categories, enumerate the catalogue, look up apps by ID or URL, find a developers apps, or export reviews. Returns ratings, installs, pricing, compatibility, contacts and OAuth scopes.",
      "version": "2.1",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Google Workspace Marketplace App Search & Category Browser\n\nExplore the public [Google Workspace Marketplace](https://workspace.google.com/marketplace) without a Google account, API key, cookie, or proxy. Search by keyword, browse any of the 27 category views, sweep the entire Marketplace, look up exact apps by ID or URL, find every app from a publisher, or export reviews.\n\n## What this actor does\n\n- **Six modes:** `search`, `byCategory`, `browseAll`, `byAppId`, `byDeveloper`, `reviews`\n- **Full catalogue coverage:** `browseAll` enumerates every category view and deduplicates by app ID (~1,500 apps)\n- **Exact app lookup:** numeric Marketplace IDs, full app URLs, or a developer name\n- **Filters:** Works-with product, price option, exact price class, minimum rating, ratings count and installs\n- **Review export:** rating range and date filters, with attached reviews or standalone review rows\n- **Optional detail enrichment:** OAuth permissions, exact Works-with icons and written-review counts\n- **Empty fields are omitted** - never `null`, blank or placeholder values\n\n## Modes\n\n| Mode | What it does | Required field | Result ceiling |\n|---|---|---|---|\n| `search` | Keyword search across the Marketplace | `searchQuery` | 100 apps per query |\n| `byCategory` | Browse one of 27 categories/subcategories | `category` | 100 apps per category |\n| `browseAll` | Walk every category, deduplicate by app ID | — | ~1,500 apps |\n| `byAppId` | Fetch exact apps from numeric IDs or Marketplace URLs | `appIds` | no practical limit |\n| `byDeveloper` | Find every app from a publisher (keyword search plus all 27 category pages, deduplicated) | `developerName` | ~1,500 apps |\n| `reviews` | Export review rows for apps, with optional rating/date filters | `appIds` | up to `maxReviewsPerApp` per app |\n\n## Output per app\n\n- `appId`, `slug`, `name`, `developer`\n- `shortDescription` and full `description`\n- `rating` (0–5), `reviewCount` (number of ratings), `textReviewCount` (number of written reviews, filled in `byAppId` mode and when `includeReviews` is on)\n- `installCount` (exact integer) and `installCountText` (`46M+`)\n- `pricingModel` — `Free`, `Freemium`, or `Paid` when the listing publishes a price\n- `worksWith` — Google products the app integrates with (Docs, Sheets, Slides, Forms, Gmail, Calendar, Chat, Meet, Classroom, Drive, Workspace Studio)\n- `developerWebsite`, `developerEmail`, `developerAddress`\n- `termsUrl`, `privacyUrl`, `supportUrl`\n- `iconUrl`, `bannerUrl`, `screenshotUrls`\n- `lastUpdated` (ISO date), `appUrl` (canonical listing URL)\n- `permissions` — OAuth scopes with human-readable names (`includeDetails`)\n- `reviews` — review objects with rating, text, date, author (`includeReviews`)\n- `recordType` (`\"workspace_app\"`), `scrapedAt` (ISO timestamp)\n\nReview rows in `reviews` mode contain `appId`, `appName`, `appUrl`, `reviewId`, `rating`, `text`, `publishedAt`, `authorName` and `authorAvatarUrl`, with `recordType` set to `\"workspace_app_review\"`.\n\n## Filters\n\n- **Works with** — `drive`, `docs`, `sheets`, `slides`, `forms`, `gmail`, `calendar`, `chat`, `classroom`, `meet`\n- **Price option** — `free` (app has a free option) or `paid` (app has a paid option)\n- **Exact price class** — `Free`, `Freemium`, `Paid`\n- **Minimum rating**, **minimum ratings count**, **minimum installs**\n- **Review rating range** — `minReviewRating` / `maxReviewRating`\n- **Reviews since** — ISO date (`YYYY-MM-DD`)\n\nApp filters are applied consistently to search, category, all-marketplace, developer and exact-app results. Review filters apply to `reviews` mode and to reviews attached with `includeReviews`; they are evaluated client-side because the review endpoint only supports sort and paging.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select | `search` | `search` / `byCategory` / `browseAll` / `byAppId` / `byDeveloper` / `reviews` |\n| `searchQuery` | string | `mail merge` | Keyword search (mode=`search`) |\n| `category` | select | `popular-apps` | One of the 27 category views (mode=`byCategory`) |\n| `appIds` | array | `[]` | Numeric app IDs or full Marketplace URLs (mode=`byAppId` / `reviews`) |\n| `developerName` | string | – | Publisher/developer name (mode=`byDeveloper`) |\n| `worksWith` | select | `any` | Keep apps that integrate with this Google product; applies to every app mode |\n| `pricing` | select | `any` | `any` / `free` / `paid` price option |\n| `pricingModel` | select | `any` | `any` / `Free` / `Freemium` / `Paid` exact class |\n| `minRating` | number | `0` | Drop apps rated below this (0-5) |\n| `minReviews` | integer | `0` | Drop apps with fewer ratings |\n| `minInstalls` | integer | `0` | Drop apps with fewer exact installs |\n| `includeDetails` | boolean | `false` | Fetch OAuth permissions, exact Works-with icons and written-review totals (one extra request per app) |\n| `includeReviews` | boolean | `false` | Attach reviews to each app record |\n| `maxReviewsPerApp` | integer | `30` | Reviews attached per app, or exported per app in `reviews` mode (1-500) |\n| `reviewSort` | select | `recent` | `recent` / `helpful` |\n| `minReviewRating` | integer | `0` | Keep reviews at or above this rating (0-5) |\n| `maxReviewRating` | integer | `0` | Keep reviews at or below this rating (0-5) |\n| `reviewsSince` | string | – | Drop reviews before this date (`YYYY-MM-DD`) |\n| `maxItems` | integer | `50` | Maximum records to emit (1-2,000) |\n| `language` | select | `en` | Language for listing and review text (25 options) |\n\n## Examples\n\n### Search\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"mail merge\",\n  \"maxItems\": 30\n}\n```\n\n### Browse a category\n\n```json\n{\n  \"mode\": \"byCategory\",\n  \"category\": \"business-tools/sales-and-crm\",\n  \"maxItems\": 50\n}\n```\n\n### Enumerate the whole Marketplace\n\n```json\n{\n  \"mode\": \"browseAll\",\n  \"worksWith\": \"docs\",\n  \"pricing\": \"paid\",\n  \"maxItems\": 500\n}\n```\n\n### Fetch apps by ID or URL\n\n```json\n{\n  \"mode\": \"byAppId\",\n  \"appIds\": [\n    \"7081045131\",\n    \"https://workspace.google.com/marketplace/app/zip_extractor/824911851129\"\n  ],\n  \"includeDetails\": true\n}\n```\n\n### Export reviews\n\n```json\n{\n  \"mode\": \"reviews\",\n  \"appIds\": [\"7081045131\"],\n  \"maxReviewsPerApp\": 50,\n  \"reviewSort\": \"recent\",\n  \"maxItems\": 50\n}\n```\n\n### Export only recent one-star reviews\n\n```json\n{\n  \"mode\": \"reviews\",\n  \"appIds\": [\"7081045131\"],\n  \"reviewSort\": \"recent\",\n  \"maxReviewRating\": 1,\n  \"reviewsSince\": \"2026-01-01\",\n  \"maxItems\": 50\n}\n```\n\n### Search in German\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"crm\",\n  \"language\": \"de\",\n  \"maxItems\": 20\n}\n```\n\n## Output rules\n\nRecords are omit-empty: a field the Marketplace does not publish for an app is left out rather than emitted as `null`, `\"\"`, or a placeholder. URLs are absolute and use the scheme the listing publishes.\n\n## Use cases\n\n- **Market mapping** - enumerate the whole Marketplace to size a category or find every app in a workflow niche\n- **Competitive research** - compare installs, ratings, pricing and feature positioning across rivals\n- **Vendor and lead discovery** - collect developer names, websites and support contacts from app listings\n- **Review monitoring** - export recent low-star reviews for product-quality or support analysis\n- **Ecosystem tracking** - follow a publisher's app portfolio and detect new listings\n\n## Limits\n\n- A search or category page returns at most **100** apps; the Marketplace ignores pagination, sort and offset parameters. Use a narrower query or `browseAll` for wider coverage.\n- `browseAll` and `byDeveloper` can reach roughly **1,500** distinct apps across the 27 category views. Apps that appear in neither the category pages nor the search index cannot be discovered.\n- The Marketplace UI offers **Workspace Studio** and **Gemini** filters, but the corresponding `host` values are inert upstream, so they are not exposed.\n- Per-app category names are not published anywhere on the Marketplace; category membership is only visible by browsing category pages, so no `categories` field is emitted.\n- The review endpoint only supports sort order and 10-review offsets. Rating/date filters are applied client-side with a 50-page scan cap per app.\n- Change tracking and market reports are not provided: this actor is stateless and does not persist snapshots between runs.\n- Publisher links (support, privacy, terms, website) point to third-party sites; some of those sites block automated requests even though the link is valid.\n\n## FAQ\n\n**Does this need a Google account or API key?** No. The Marketplace is public and the actor reads it with no authentication, cookies, or proxy.\n\n**Why is a search limited to 100 apps?** The Marketplace serves a fixed top-100 list per query and ignores pagination parameters. Use a narrower query, or use `browseAll` to enumerate the whole catalogue.\n\n**Why did an app's price disappear?** The listing publishes a price class only for some apps. When it says \"Not available\", the field is omitted instead of guessing.\n\n**Why are categories not in the output?** The Marketplace does not expose per-app category names on an app's page or in its data. Category membership is only visible by browsing category pages, so the actor does not invent it.\n\n**How fresh are reviews?** Reviews are fetched live in 10-review pages, newest or most helpful first. `reviewCount` counts ratings; `textReviewCount` counts written reviews.\n\n**Can I filter reviews by date or rating?** Yes — use `minReviewRating`, `maxReviewRating` and `reviewsSince`. The Marketplace review endpoint itself only supports sort order and paging, so the actor pages through reviews and filters them client-side, scanning up to 50 pages (500 reviews) per app. A very restrictive filter can therefore return fewer rows than requested.\n\n**How complete is `byDeveloper`?** The Marketplace has no developer-search endpoint, so the actor combines keyword searches for the publisher name with a scan of all 27 category pages and keeps records whose developer matches the name. That reaches every app exposed by either surface; apps that appear on neither surface cannot be discovered.\n\n**Are screenshots and icons publicly accessible?** Yes — Google hosts them at `lh3.googleusercontent.com` and they return images from a clean client. Publisher websites linked from a listing can block automated requests with a 403; open those links in a browser.\n\n**Is this affiliated with Google?** No. This is an independent actor reading the public Google Workspace Marketplace and is not operated by or affiliated with Google.\n",
      "input": {
        "title": "Google Workspace Marketplace Scraper Input",
        "description": "Search apps, browse categories, enumerate the whole Marketplace, fetch apps by ID or URL, list a developer's apps, or export reviews.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to fetch. search=keyword search; byCategory=one category; browseAll=every category (deduplicated); byAppId=exact apps; byDeveloper=apps by publisher name (keyword search plus all category pages); reviews=review rows with optional rating/date filters.",
            "editor": "select",
            "enum": [
              "search",
              "byCategory",
              "browseAll",
              "byAppId",
              "byDeveloper",
              "reviews"
            ],
            "enumTitles": [
              "Search by keyword",
              "Browse one category",
              "Enumerate the whole Marketplace",
              "Fetch specific apps by ID or URL",
              "Find apps by developer",
              "Export app reviews"
            ],
            "default": "search",
            "prefill": "search"
          },
          "searchQuery": {
            "title": "Search query (mode=search)",
            "type": "string",
            "description": "Keyword to search for. Required in search mode. The Marketplace returns at most 100 apps per query.",
            "editor": "textfield",
            "default": "mail merge",
            "prefill": "mail merge"
          },
          "category": {
            "title": "Category (mode=byCategory)",
            "type": "string",
            "description": "Category or subcategory to browse. Required in byCategory mode.",
            "editor": "select",
            "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/office-applications",
              "productivity/task-management",
              "productivity/web-development",
              "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 (formerly Integrations)",
              "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 / Office applications",
              "Productivity / Task management",
              "Productivity / Web development",
              "Education (all)",
              "Education / Academic resources",
              "Education / Teacher & admin tools",
              "Communication",
              "Utilities",
              "Admin managed (Enterprise)"
            ],
            "default": "popular-apps",
            "prefill": "popular-apps"
          },
          "appIds": {
            "title": "App IDs or URLs (mode=byAppId / reviews)",
            "type": "array",
            "description": "Numeric Marketplace app IDs or full app URLs. Required for byAppId and reviews modes.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "developerName": {
            "title": "Developer name (mode=byDeveloper)",
            "type": "string",
            "description": "Publisher/developer name to look up, e.g. `Lucid Software`. Required in byDeveloper mode.",
            "editor": "textfield"
          },
          "worksWith": {
            "title": "Works with",
            "type": "string",
            "description": "Keep only apps that integrate with this Google product. Applied to every app mode: search, byCategory, browseAll, byDeveloper and byAppId.",
            "editor": "select",
            "enum": [
              "any",
              "drive",
              "docs",
              "sheets",
              "slides",
              "forms",
              "gmail",
              "calendar",
              "chat",
              "classroom",
              "meet"
            ],
            "enumTitles": [
              "Any Google product",
              "Google Drive",
              "Google Docs",
              "Google Sheets",
              "Google Slides",
              "Google Forms",
              "Gmail",
              "Google Calendar",
              "Google Chat",
              "Google Classroom",
              "Google Meet"
            ],
            "default": "any",
            "prefill": "any",
            "sectionCaption": "Filters",
            "sectionDescription": "Optional filters applied to every app mode, including byAppId records."
          },
          "pricing": {
            "title": "Price option",
            "type": "string",
            "description": "Marketplace price facet: free = the app has a free option; paid = the app has a paid option. Applied to every app mode, including byAppId. Use the next field for an exact price class.",
            "editor": "select",
            "enum": [
              "any",
              "free",
              "paid"
            ],
            "enumTitles": [
              "Any price",
              "Has a free option",
              "Has a paid option"
            ],
            "default": "any",
            "prefill": "any"
          },
          "pricingModel": {
            "title": "Exact price class",
            "type": "string",
            "description": "Keep only apps with this exact published price class. Apps with no published price are omitted when a class is selected.",
            "editor": "select",
            "enum": [
              "any",
              "Free",
              "Freemium",
              "Paid"
            ],
            "enumTitles": [
              "Any class",
              "Free",
              "Freemium (free tier + paid features)",
              "Paid"
            ],
            "default": "any",
            "prefill": "any"
          },
          "minRating": {
            "title": "Minimum rating",
            "type": "number",
            "description": "Drop apps rated below this value (0–5). 0 = no minimum.",
            "minimum": 0,
            "maximum": 5,
            "default": 0,
            "prefill": 0
          },
          "minReviews": {
            "title": "Minimum ratings count",
            "type": "integer",
            "description": "Drop apps with fewer ratings than this. 0 = no minimum.",
            "minimum": 0,
            "maximum": 10000000,
            "default": 0,
            "prefill": 0
          },
          "minInstalls": {
            "title": "Minimum installs",
            "type": "integer",
            "description": "Drop apps installed fewer times than this (exact count). 0 = no minimum.",
            "minimum": 0,
            "maximum": 10000000000,
            "default": 0,
            "prefill": 0
          },
          "includeDetails": {
            "title": "Include permissions and detail enrichment",
            "type": "boolean",
            "description": "Fetch each app's detail page to add OAuth permissions, exact Works-with icons and the text-review total. Adds one request per emitted app.",
            "default": false,
            "prefill": false,
            "sectionCaption": "Details & reviews",
            "sectionDescription": "Optional enrichment. Both options add extra requests per app; leave them off for the fastest, cheapest runs."
          },
          "includeReviews": {
            "title": "Include reviews on each app",
            "type": "boolean",
            "description": "Attach reviews to each app record. The rating and date filters below also apply. Ignored by reviews mode, which always emits review rows.",
            "default": false,
            "prefill": false
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app",
            "type": "integer",
            "description": "How many matching reviews to attach in includeReviews, or how many to export per app in reviews mode.",
            "minimum": 1,
            "maximum": 500,
            "default": 30,
            "prefill": 3
          },
          "reviewSort": {
            "title": "Review sort",
            "type": "string",
            "description": "Order of exported/attached reviews.",
            "editor": "select",
            "enum": [
              "recent",
              "helpful"
            ],
            "enumTitles": [
              "Most recent",
              "Most helpful"
            ],
            "default": "recent",
            "prefill": "recent"
          },
          "minReviewRating": {
            "title": "Minimum review rating",
            "type": "integer",
            "description": "Drop reviews rated below this value (0-5). 0 = no minimum. Applies to reviews mode and includeReviews; filtering happens client-side over fetched review pages.",
            "minimum": 0,
            "maximum": 5,
            "default": 0,
            "prefill": 0
          },
          "maxReviewRating": {
            "title": "Maximum review rating",
            "type": "integer",
            "description": "Drop reviews rated above this value (0-5). 0 = no maximum. Applies to reviews mode and includeReviews.",
            "minimum": 0,
            "maximum": 5,
            "default": 0,
            "prefill": 0
          },
          "reviewsSince": {
            "title": "Reviews since",
            "type": "string",
            "description": "Drop reviews published before this date (YYYY-MM-DD). Leave empty for no date limit. Applies to reviews mode and includeReviews.",
            "editor": "textfield",
            "default": ""
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "Maximum records to emit. Search and category pages hold at most 100 apps each; browseAll can reach about 1,500 apps. In reviews mode this caps review rows.",
            "minimum": 1,
            "maximum": 2000,
            "default": 50,
            "prefill": 3,
            "sectionCaption": "Output",
            "sectionDescription": "How much data to return and which language the listing pages are read in."
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language for listing text and review content.",
            "editor": "select",
            "enum": [
              "en",
              "es",
              "fr",
              "de",
              "pt",
              "ja",
              "zh",
              "ko",
              "it",
              "nl",
              "pl",
              "ru",
              "ar",
              "tr",
              "id",
              "th",
              "vi",
              "sv",
              "da",
              "fi",
              "no",
              "cs",
              "hu",
              "ro",
              "uk"
            ],
            "enumTitles": [
              "English",
              "Spanish",
              "French",
              "German",
              "Portuguese",
              "Japanese",
              "Chinese",
              "Korean",
              "Italian",
              "Dutch",
              "Polish",
              "Russian",
              "Arabic",
              "Turkish",
              "Indonesian",
              "Thai",
              "Vietnamese",
              "Swedish",
              "Danish",
              "Finnish",
              "Norwegian",
              "Czech",
              "Hungarian",
              "Romanian",
              "Ukrainian"
            ],
            "default": "en",
            "prefill": "en"
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Google Workspace Marketplace App Search & Category Browser Output",
        "description": "App records with name, developer contacts, rating, ratings count, exact installs, pricing class, compatible Google products, screenshots, support links and OAuth permissions; review records when exporting reviews.",
        "properties": {
          "apps": {
            "type": "string",
            "title": "Workspace Marketplace records",
            "description": "Dataset containing app records (and review rows in reviews mode).",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Workspace Apps",
              "transformation": {
                "fields": [
                  "appId",
                  "name",
                  "developer",
                  "rating",
                  "reviewCount",
                  "installCount",
                  "pricingModel",
                  "worksWith",
                  "lastUpdated",
                  "appUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "appId": {
                    "label": "App ID",
                    "format": "text"
                  },
                  "name": {
                    "label": "Name",
                    "format": "text"
                  },
                  "developer": {
                    "label": "Developer",
                    "format": "text"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "reviewCount": {
                    "label": "Ratings",
                    "format": "number"
                  },
                  "installCount": {
                    "label": "Installs",
                    "format": "number"
                  },
                  "pricingModel": {
                    "label": "Pricing",
                    "format": "text"
                  },
                  "worksWith": {
                    "label": "Works with",
                    "format": "text"
                  },
                  "lastUpdated": {
                    "label": "Updated",
                    "format": "text"
                  },
                  "appUrl": {
                    "label": "URL",
                    "format": "link"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "2.1.1",
    "imageDigest": "95c2f78ee25f60e19f31ca5d5c18ef9bdbf504cea08f9516c8935ef7c6906fe7",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "2.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.01173111111111111
    }
  }
}