# Workspace Marketplace Vendors · Email · $4/1k (`corent1robert/google-workspace-marketplace-vendors`) Actor

Export unique Google Workspace Marketplace vendors — one row per publisher, not per app. Website, exact users, public email when Google or the vendor site publishes it. $4 / 1k vendors + $6 / 1k extra for an email. Clay, Lemlist, partnerships, security. Empty shells not billed.

- **URL**: https://apify.com/corent1robert/google-workspace-marketplace-vendors.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.66 / 1,000 vendor scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Workspace Marketplace Vendors do?

Reads the public [Google Workspace Marketplace](https://workspace.google.com/marketplace) and writes **one row per unique vendor** — not one row per app.

You get the **vendor website**, the **exact user count** of their biggest listing, and a **public email** when Google or the vendor site publishes one. Mid-market ISVs (SysCloud, Talarian, YAMM) are the file. Adobe / Canva stay a website with no mailto — that is expected.

This is **not** a dump of every Marketplace app, and it is **not** a Google Play developer-contacts clone. The unit is the **account that already sells to Workspace admins**.

### Who is this for?

This is for you if you sell **into Google Workspace** and you need the **vendor**, not the listing screenshot.

- **Partnerships / ISV / marketplace BD** — who already has admins, how many users, and a public `hello@` / `info@` when it exists.
- **Security / CASB / MSP** — slice `security`, keep `usersExact`, optionally turn **Include OAuth scopes** on for `admin.directory`.
- **Clay / Lemlist / HubSpot** — one domain, one email, one user number. No icons, no screenshot galleries, no 4k-character descriptions.

Do not paste fifty hidden keywords hoping to paginate past Google’s **100-app cap**. Volume is the **union of slices** (keyword × Works with × category × free/paid), then unique vendor.

### Why scrape Google Workspace Marketplace vendors?

- Turn a Marketplace slice into a **vendor file** you can enrich (domain → SIREN, Clay waterfall) without opening 100 listing tabs
- Keep the **exact user integer** Google already publishes in the listing blob (`9913898`, not “10M+” guessed from a badge)
- Find a **public email** on the listing first; if missing, hop the vendor site the same way Domain to SIREN hops mentions (homepage hrefs, then `/contact` / `/legal-notice` on the **same** eTLD+1)
- Skip Google’s own apps (they never publish a mailto) and skip inventing `name at domain` → `@`

On Apify you can **schedule** runs, download **JSON / CSV / Excel**, and push to Sheets, Make, n8n or Clay.

### What data can this Workspace Marketplace scraper extract?

| Field | Description |
|---|---|
| `domain`, `vendorName`, `vendorWebsite` | Unique vendor (eTLD+1 of the listing website) |
| `email`, `emails`, `emailSource` | Best public address + all kept addresses. Source is `marketplace` or `website` |
| `legalAddress` | Street address when Google publishes one — **not** emails stuffed in the legal slot |
| `usersExactMax`, `usersBandMax`, `ratingMax` | Best app’s exact users, public band, rating |
| `appCount`, `apps[]` | Slim listings: name, usersExact, listingUrl |
| `hasAdminDirectoryScope` | Only when **Include OAuth scopes** is on |
| `supportUrl`, `sourceQuery`, `sourceHosts`, `scrapedAt` | Support link and how the slice was built |

Not extracted (and not invented): impressions, DAU, private inboxes, screenshots, long descriptions, terms/privacy bodies, `name at company.com` obfuscation.

### How to export Google Workspace Marketplace vendors

1. Open this Actor in Apify Console.
2. **Step 1 — Mode:** leave **Search**.
3. **Step 2 — Slice:** keep the keyword `security`, or pick **Works with** (Gmail, Meet, Classroom…) and/or a category. Meet and Classroom often return **under 100** apps — a complete slice.
4. **Step 3 — Output:** default **20** vendors, **Require public email = Yes**. Click **Start**.

See the **Input** tab for the visible options (proxy is optional and hidden).

**Be honest about coverage:**

- Google **hard-caps ~100 apps per query**. There is no page 2, no offset, no “Load more”. Independent confirmation goes back to 2022. More vendors = **more slices**, then unique domain.
- `robots.txt` **Disallow: /marketplace/**. This Actor still GETs public listing HTML. You are responsible for how you use the file (GDPR / legitimate interest for B2B outreach).
- **minUsers** is a **local** filter on `usersExact`. Google ignores `?minUsers=` on the site.
- Website hop does **not** invent emails. Talarian’s `/contact` 404s; `/legal-notice` has `legal@talarian.io`. `support@vercel.com` on a Next.js page is dropped (wrong eTLD+1).

### How much does it cost to scrape Marketplace vendors?

**$4 per 1,000 vendors** on the Free plan, plus **$6 per 1,000** extra when a public email is written. Actor start is **$0.00005** (invisible). Rows with no website and no identity are **$0**.

Live Apify Store comps (16 Aug 2026):

| Actor | You pay for | Free / 1k |
|---|---|---|
| [crawlerbros Marketplace apps](https://apify.com/crawlerbros/google-workspace-marketplace-scraper) | 1 **app** row | **$5.00** |
| [lead.gen.labs vendor leads](https://apify.com/lead.gen.labs/google-workspace-marketplace-vendor-leads) | 1 record (+ **$0.05** start) | **~$20** |
| **This Actor** | **1 unique vendor** + optional email | **$4** vendor · **$6** email |

You are not paying $20/1k plus a $0.05 start for a record, and you are not paying per app when the same ISV lists three add-ons.

Paid Apify plans go lower. Diamond is **$2 / 1k** vendors and **$3 / 1k** emails.

**Free plan:** a run stops at **20 vendors** — enough to test (~$0.20 if all 20 have an email: 20 × $0.004 + 20 × $0.006).

| Apify plan | Vendor / 1k | Email / 1k |
|---|---|---|
| Free | **$4.00** | **$6.00** |
| Bronze | **$3.55** | **$5.32** |
| Silver | **$3.10** | **$4.65** |
| Gold | **$2.66** | **$3.99** |
| Platinum | **$2.66** | **$3.99** |
| Diamond | **$2.00** | **$3.00** |

Set **Max vendors** and, on Apify, a **max total charge** so a run cannot exceed your budget.

### Input

See the **Input** tab. Visible fields:

- **Mode** — Search (default) or Catalog (all 27 categories + 10 Works with hosts)
- **Keyword or listing URL** — prefilled `security`. Paste a listing URL to scrape one app’s vendor.
- **Works with** — Google’s real `?host=` (Gmail ≠ keyword “gmail”)
- **Categories** — hubs work here (unlike Chrome Web Store parents)
- **Listing price** — Any / Free of charge / Paid
- **Max vendors**, **Require public email**, **Min users**, **Find email on vendor website**, **Include OAuth scopes**

Proxy and delay are hidden.

### Output

You can download the dataset as JSON, HTML, CSV or Excel. Use **Vendors — With email** for the Clay file.

```json
{
  "domain": "syscloud.com",
  "vendorName": "SysCloud Inc",
  "vendorWebsite": "https://www.syscloud.com",
  "email": "palani@syscloud.com",
  "emails": ["palani@syscloud.com", "rahul@syscloud.com"],
  "emailSource": "marketplace",
  "usersExactMax": 9913898,
  "appCount": 1,
  "apps": [
    {
      "name": "SysCloud Backup",
      "usersExact": 9913898,
      "listingUrl": "https://workspace.google.com/marketplace/app/syscloud/..."
    }
  ]
}
```

A vendor with a website and no public email is still a row if you set **Require public email = No**. That row is billed as **vendor** only.

### Tips

- Prefer **Works with = Meet** or **Classroom** when you want a **complete** slice under the 100-app cap.
- Combine `security` + `host=gmail` — it is **not** the same 100 IDs as `security` alone.
- Leave **Include OAuth scopes** off unless you sell security. Search HTML mixes scopes; we GET the app page only when this is on (max 4 apps per vendor).
- After this file, hop French domains into [Domain to SIREN](https://apify.com/corent1robert/domain-siren-scraper).

### FAQ

#### Can I paginate past 100 apps?

No. `?page=2`, `start`, `offset`, `num` return the **same IDs**. Google caps the HTML blob. Use another slice.

#### Do you scrape private emails?

No. Only addresses published on the listing or on the vendor’s own site (same registrable domain). `sentry.io`, `googleapis`, `support@vercel.com` on a hosted page are dropped.

#### Is this legal?

We only read **public** Marketplace listing pages and **public** vendor websites. Google’s `robots.txt` disallows `/marketplace/` — that is disclosed, not hidden. You are responsible for how you use vendor contacts (GDPR / legitimate interest for B2B outreach).

Our Actors do not extract private user data such as personal inboxes or home addresses. Company emails and legal addresses published on a Marketplace listing or a corporate site are not private user profiles. You should still have a legitimate reason to process this data. If you are unsure, consult your lawyers.

#### I need something custom

corentin@outreacher.fr — or open an issue on the Actor’s **Issues** tab. Programmatic runs: see the **API** tab.

# Actor input Schema

## `coverage` (type: `string`):

**Search (default):** Step 2 — keyword and/or categories and/or Works with.

**Catalog (paid):** walks every Marketplace category plus every Works with host. Google caps each page at 100 apps. Not a sitemap of all ~5,200 listings.

## `query` (type: `string`):

Examples: `security` · `crm` · a Marketplace app URL.

Leave empty if you only pick categories / Works with. **Ignored** in Catalog mode.

## `hosts` (type: `array`):

Google’s real filter (`?host=`). Gmail ≠ a keyword search for “gmail”. Meet and Classroom often return **under 100** (complete slice).

## `categories` (type: `array`):

Multi-select. Hubs work (unlike Chrome Web Store parents). Union + unique vendor.

## `pricing` (type: `string`):

Google `?pricing=` filter. **Any** = do not send it.

## `maxVendors` (type: `integer`):

Unique vendor rows (not apps). Default **20** keeps first runs cheap. Free Apify plans stop at 20.

## `requireEmail` (type: `string`):

**Yes (default):** skip vendors with no public email (listing or vendor website).

**No:** keep the account file (website + users) even without a mailto.

## `minUsers` (type: `integer`):

Keep vendors whose **best app** has at least this many Marketplace users (blob integer, e.g. `10000`). **0** = no filter. This is **not** a Google query — we filter after the slice.

## `hopWebsite` (type: `string`):

**Yes (default):** if the listing has no email, GET the vendor site (homepage + contact/legal hrefs, same domain). Mid-market often has `info@` / `hello@`. Adobe / Canva forms stay empty.

## `includeScopes` (type: `string`):

**No (default):** Clay-friendly row. **Yes:** extra GET per app, `hasAdminDirectoryScope` + scope URLs. For security / CASB runs.

## `proxyConfiguration` (type: `object`):

Optional. First request is direct. One retry with this proxy on 403 / challenge. Hidden in Console.

## `minDelayMs` (type: `integer`):

Pause between HTTP requests.

## Actor input object example

```json
{
  "coverage": "search",
  "query": "security",
  "pricing": "any",
  "maxVendors": 20,
  "requireEmail": "yes",
  "minUsers": 0,
  "hopWebsite": "yes",
  "includeScopes": "no",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "minDelayMs": 350
}
```

# Actor output Schema

## `overview` (type: `string`):

Domain, vendor, email, users

## `withEmail` (type: `string`):

Rows with a public email

## `dataset` (type: `string`):

All vendor rows

## `output` (type: `string`):

Pushed / withEmail / hopped counts

## `runLog` (type: `string`):

Live progress

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "query": "security"
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/google-workspace-marketplace-vendors").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "query": "security" }

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/google-workspace-marketplace-vendors").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "security"
}' |
apify call corent1robert/google-workspace-marketplace-vendors --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/google-workspace-marketplace-vendors"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1ulPb0h08yPAbdNRc/builds/dneMjYH0iimW9dhOF/openapi.json
